/* * (C) 2007-2012 Alibaba Group Holding Limited. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * Authors: * wuhua <wq163@163.com> , boyan <killme2008@gmail.com> */ package com.taobao.metamorphosis.gregor.slave; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.taobao.gecko.service.RemotingServer; import com.taobao.metamorphosis.network.BooleanCommand; import com.taobao.metamorphosis.network.HttpStatus; import com.taobao.metamorphosis.network.SyncCommand; import com.taobao.metamorphosis.server.BrokerZooKeeper; import com.taobao.metamorphosis.server.assembly.BrokerCommandProcessor; import com.taobao.metamorphosis.server.assembly.ExecutorsManager; import com.taobao.metamorphosis.server.filter.ConsumerFilterManager; import com.taobao.metamorphosis.server.network.PutCallback; import com.taobao.metamorphosis.server.network.SessionContext; import com.taobao.metamorphosis.server.stats.StatsManager; import com.taobao.metamorphosis.server.store.MessageStore; import com.taobao.metamorphosis.server.store.MessageStoreManager; import com.taobao.metamorphosis.server.utils.MetaConfig; import com.taobao.metamorphosis.utils.IdWorker; /** * Slave��Э�鴦���� * * @author boyan(boyan@taobao.com) * @date 2011-12-14 * */ public class GregorCommandProcessor extends BrokerCommandProcessor implements SyncCommandProcessor { public static final Log log = LogFactory.getLog(GregorCommandProcessor.class); public GregorCommandProcessor() { super(); } public GregorCommandProcessor(final MessageStoreManager storeManager, final ExecutorsManager executorsManager, final StatsManager statsManager, final RemotingServer remotingServer, final MetaConfig metaConfig, final IdWorker idWorker, final BrokerZooKeeper brokerZooKeeper, ConsumerFilterManager consumerFilterManager) { super(storeManager, executorsManager, statsManager, remotingServer, metaConfig, idWorker, brokerZooKeeper, consumerFilterManager); } @Override public void processSyncCommand(final SyncCommand request, final SessionContext sessionContext, final PutCallback cb) { final String partitionString = this.metaConfig.getBrokerId() + "-" + request.getPartition(); this.statsManager.statsPut(request.getTopic(), partitionString, 1); this.statsManager.statsMessageSize(request.getTopic(), request.getData().length); try { if (this.metaConfig.isClosedPartition(request.getTopic(), request.getPartition())) { log.warn("Can not put message to partition " + request.getPartition() + " for topic=" + request.getTopic() + ",it was closed"); if (cb != null) { cb.putComplete(new BooleanCommand(HttpStatus.Forbidden, this.genErrorMessage(request.getTopic(), request.getPartition()) + "Detail:Partition[" + partitionString + "] has been closed", request .getOpaque())); } return; } // ʹ��master�������ķ��� final int partition = request.getPartition(); final MessageStore store = this.storeManager.getOrCreateMessageStore(request.getTopic(), partition); // ʹ��master��������id final long messageId = request.getMsgId(); store.append(messageId, request, new StoreAppendCallback(partition, partitionString, request, messageId, cb)); } catch (final Exception e) { this.statsManager.statsPutFailed(request.getTopic(), partitionString, 1); log.error("Put message failed", e); if (cb != null) { cb.putComplete(new BooleanCommand(HttpStatus.InternalServerError, this.genErrorMessage( request.getTopic(), request.getPartition()) + "Detail:" + e.getMessage(), request.getOpaque())); } } } }