/** * $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; } }