/**
* $Id: ClientManageProcessor.java 1831 2013-05-16 01:39:51Z shijia.wxr $
*/
package com.alibaba.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.rocketmq.broker.BrokerController;
import com.alibaba.rocketmq.broker.client.ClientChannelInfo;
import com.alibaba.rocketmq.common.MixAll;
import com.alibaba.rocketmq.common.protocol.MQProtos.MQRequestCode;
import com.alibaba.rocketmq.common.protocol.header.SendMessageRequestHeader;
import com.alibaba.rocketmq.common.protocol.header.SendMessageResponseHeader;
import com.alibaba.rocketmq.common.protocol.header.UnregisterClientRequestHeader;
import com.alibaba.rocketmq.common.protocol.header.UnregisterClientResponseHeader;
import com.alibaba.rocketmq.common.protocol.heartbeat.ConsumerData;
import com.alibaba.rocketmq.common.protocol.heartbeat.HeartbeatData;
import com.alibaba.rocketmq.common.protocol.heartbeat.ProducerData;
import com.alibaba.rocketmq.remoting.common.RemotingHelper;
import com.alibaba.rocketmq.remoting.exception.RemotingCommandException;
import com.alibaba.rocketmq.remoting.netty.NettyRequestProcessor;
import com.alibaba.rocketmq.remoting.protocol.RemotingCommand;
import com.alibaba.rocketmq.remoting.protocol.RemotingProtos.ResponseCode;
import com.google.protobuf.InvalidProtocolBufferException;
/**
* Clientע����ע������
*
* @author vintage.wang@gmail.com shijia.wxr@taobao.com
*
*/
public class ClientManageProcessor implements NettyRequestProcessor {
private static final Logger log = LoggerFactory.getLogger(MixAll.BrokerLoggerName);
private final BrokerController brokerController;
public ClientManageProcessor(final BrokerController brokerController) {
this.brokerController = brokerController;
}
@Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException {
MQRequestCode code = MQRequestCode.valueOf(request.getCode());
switch (code) {
case HEART_BEAT:
return this.heartBeat(ctx, request);
case UNREGISTER_CLIENT:
return this.unregisterClient(ctx, request);
default:
break;
}
return null;
}
public RemotingCommand unregisterClient(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException {
final RemotingCommand response =
RemotingCommand.createResponseCommand(UnregisterClientResponseHeader.class);
final UnregisterClientResponseHeader responseHeader =
(UnregisterClientResponseHeader) response.getCustomHeader();
final UnregisterClientRequestHeader requestHeader =
(UnregisterClientRequestHeader) request
.decodeCommandCustomHeader(UnregisterClientRequestHeader.class);
ClientChannelInfo clientChannelInfo = new ClientChannelInfo(//
ctx.channel(),//
requestHeader.getClientID(),//
request.getLanguage(),//
request.getVersion()//
);
// ע��Producer
final String producerGroup = requestHeader.getProducerGroup();
if (producerGroup != null) {
this.brokerController.getProducerManager().unregisterProducer(producerGroup, clientChannelInfo);
}
// ע��Consumer
final String consumerGroup = requestHeader.getProducerGroup();
if (consumerGroup != null) {
this.brokerController.getConsumerManager().unregisterConsumer(consumerGroup, clientChannelInfo);
}
response.setCode(ResponseCode.SUCCESS_VALUE);
response.setRemark(null);
return response;
}
public RemotingCommand heartBeat(ChannelHandlerContext ctx, RemotingCommand request) {
RemotingCommand response = RemotingCommand.createResponseCommand(null);
HeartbeatData heartbeatData = null;
try {
heartbeatData = HeartbeatData.decode(request.getBody());
}
catch (InvalidProtocolBufferException e) {
log.error("decode heartbeat body from channel[{}] error",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
response.setRemark("decode heartbeat body error");
return response;
}
ClientChannelInfo clientChannelInfo = new ClientChannelInfo(//
ctx.channel(),//
heartbeatData.getClientID(),//
request.getLanguage(),//
request.getVersion()//
);
// ע��Consumer
for (ConsumerData data : heartbeatData.getConsumerDataSet()) {
this.brokerController.getConsumerManager().registerConsumer(//
data.getGroupName(),//
clientChannelInfo,//
data.getConsumeType(),//
data.getMessageModel(),//
data.getSubscriptionDataSet()//
);
}
// ע��Producer
for (ProducerData data : heartbeatData.getProducerDataSet()) {
this.brokerController.getProducerManager().registerProducer(data.getGroupName(), clientChannelInfo);
}
response.setCode(ResponseCode.SUCCESS_VALUE);
response.setRemark(null);
return response;
}
}