提交 388ba7a5 编写于 作者: Y yukon

ROCKETMQ-18 Reformat all codes.

上级 95cfb8d1
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
limitations under the License. limitations under the License.
--> -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>org.apache.rocketmq</groupId> <groupId>org.apache.rocketmq</groupId>
......
...@@ -16,7 +16,25 @@ ...@@ -16,7 +16,25 @@
*/ */
package org.apache.rocketmq.broker; package org.apache.rocketmq.broker;
import org.apache.rocketmq.broker.client.*; import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.rocketmq.broker.client.ClientHousekeepingService;
import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener;
import org.apache.rocketmq.broker.client.ConsumerManager;
import org.apache.rocketmq.broker.client.DefaultConsumerIdsChangeListener;
import org.apache.rocketmq.broker.client.ProducerManager;
import org.apache.rocketmq.broker.client.net.Broker2Client; import org.apache.rocketmq.broker.client.net.Broker2Client;
import org.apache.rocketmq.broker.client.rebalance.RebalanceLockManager; import org.apache.rocketmq.broker.client.rebalance.RebalanceLockManager;
import org.apache.rocketmq.broker.filtersrv.FilterServerManager; import org.apache.rocketmq.broker.filtersrv.FilterServerManager;
...@@ -30,11 +48,21 @@ import org.apache.rocketmq.broker.offset.ConsumerOffsetManager; ...@@ -30,11 +48,21 @@ import org.apache.rocketmq.broker.offset.ConsumerOffsetManager;
import org.apache.rocketmq.broker.out.BrokerOuterAPI; import org.apache.rocketmq.broker.out.BrokerOuterAPI;
import org.apache.rocketmq.broker.plugin.MessageStoreFactory; import org.apache.rocketmq.broker.plugin.MessageStoreFactory;
import org.apache.rocketmq.broker.plugin.MessageStorePluginContext; import org.apache.rocketmq.broker.plugin.MessageStorePluginContext;
import org.apache.rocketmq.broker.processor.*; import org.apache.rocketmq.broker.processor.AdminBrokerProcessor;
import org.apache.rocketmq.broker.processor.ClientManageProcessor;
import org.apache.rocketmq.broker.processor.ConsumerManageProcessor;
import org.apache.rocketmq.broker.processor.EndTransactionProcessor;
import org.apache.rocketmq.broker.processor.PullMessageProcessor;
import org.apache.rocketmq.broker.processor.QueryMessageProcessor;
import org.apache.rocketmq.broker.processor.SendMessageProcessor;
import org.apache.rocketmq.broker.slave.SlaveSynchronize; import org.apache.rocketmq.broker.slave.SlaveSynchronize;
import org.apache.rocketmq.broker.subscription.SubscriptionGroupManager; import org.apache.rocketmq.broker.subscription.SubscriptionGroupManager;
import org.apache.rocketmq.broker.topic.TopicConfigManager; import org.apache.rocketmq.broker.topic.TopicConfigManager;
import org.apache.rocketmq.common.*; import org.apache.rocketmq.common.BrokerConfig;
import org.apache.rocketmq.common.Configuration;
import org.apache.rocketmq.common.ThreadFactoryImpl;
import org.apache.rocketmq.common.TopicConfig;
import org.apache.rocketmq.common.UtilAll;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.constant.PermName; import org.apache.rocketmq.common.constant.PermName;
import org.apache.rocketmq.common.namesrv.RegisterBrokerResult; import org.apache.rocketmq.common.namesrv.RegisterBrokerResult;
...@@ -43,7 +71,11 @@ import org.apache.rocketmq.common.protocol.body.TopicConfigSerializeWrapper; ...@@ -43,7 +71,11 @@ import org.apache.rocketmq.common.protocol.body.TopicConfigSerializeWrapper;
import org.apache.rocketmq.common.stats.MomentStatsItem; import org.apache.rocketmq.common.stats.MomentStatsItem;
import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.RemotingServer; import org.apache.rocketmq.remoting.RemotingServer;
import org.apache.rocketmq.remoting.netty.*; import org.apache.rocketmq.remoting.netty.NettyClientConfig;
import org.apache.rocketmq.remoting.netty.NettyRemotingServer;
import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.netty.NettyServerConfig;
import org.apache.rocketmq.remoting.netty.RequestTask;
import org.apache.rocketmq.store.DefaultMessageStore; import org.apache.rocketmq.store.DefaultMessageStore;
import org.apache.rocketmq.store.MessageArrivingListener; import org.apache.rocketmq.store.MessageArrivingListener;
import org.apache.rocketmq.store.MessageStore; import org.apache.rocketmq.store.MessageStore;
...@@ -54,15 +86,6 @@ import org.apache.rocketmq.store.stats.BrokerStatsManager; ...@@ -54,15 +86,6 @@ import org.apache.rocketmq.store.stats.BrokerStatsManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
public class BrokerController { public class BrokerController {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private static final Logger LOG_PROTECTION = LoggerFactory.getLogger(LoggerName.PROTECTION_LOGGER_NAME); private static final Logger LOG_PROTECTION = LoggerFactory.getLogger(LoggerName.PROTECTION_LOGGER_NAME);
...@@ -84,7 +107,7 @@ public class BrokerController { ...@@ -84,7 +107,7 @@ public class BrokerController {
private final RebalanceLockManager rebalanceLockManager = new RebalanceLockManager(); private final RebalanceLockManager rebalanceLockManager = new RebalanceLockManager();
private final BrokerOuterAPI brokerOuterAPI; private final BrokerOuterAPI brokerOuterAPI;
private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl( private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(
"BrokerControllerScheduledThread")); "BrokerControllerScheduledThread"));
private final SlaveSynchronize slaveSynchronize; private final SlaveSynchronize slaveSynchronize;
private final BlockingQueue<Runnable> sendThreadPoolQueue; private final BlockingQueue<Runnable> sendThreadPoolQueue;
private final BlockingQueue<Runnable> pullThreadPoolQueue; private final BlockingQueue<Runnable> pullThreadPoolQueue;
...@@ -110,10 +133,10 @@ public class BrokerController { ...@@ -110,10 +133,10 @@ public class BrokerController {
private Configuration configuration; private Configuration configuration;
public BrokerController(// public BrokerController(//
final BrokerConfig brokerConfig, // final BrokerConfig brokerConfig, //
final NettyServerConfig nettyServerConfig, // final NettyServerConfig nettyServerConfig, //
final NettyClientConfig nettyClientConfig, // final NettyClientConfig nettyClientConfig, //
final MessageStoreConfig messageStoreConfig // final MessageStoreConfig messageStoreConfig //
) { ) {
this.brokerConfig = brokerConfig; this.brokerConfig = brokerConfig;
this.nettyServerConfig = nettyServerConfig; this.nettyServerConfig = nettyServerConfig;
...@@ -151,9 +174,9 @@ public class BrokerController { ...@@ -151,9 +174,9 @@ public class BrokerController {
this.brokerFastFailure = new BrokerFastFailure(this); this.brokerFastFailure = new BrokerFastFailure(this);
this.configuration = new Configuration( this.configuration = new Configuration(
log, log,
BrokerPathConfigHelper.getBrokerConfigPath(), BrokerPathConfigHelper.getBrokerConfigPath(),
this.brokerConfig, this.nettyServerConfig, this.nettyClientConfig, this.messageStoreConfig this.brokerConfig, this.nettyServerConfig, this.nettyClientConfig, this.messageStoreConfig
); );
} }
...@@ -180,9 +203,9 @@ public class BrokerController { ...@@ -180,9 +203,9 @@ public class BrokerController {
if (result) { if (result) {
try { try {
this.messageStore = this.messageStore =
new DefaultMessageStore(this.messageStoreConfig, this.brokerStatsManager, this.messageArrivingListener, new DefaultMessageStore(this.messageStoreConfig, this.brokerStatsManager, this.messageArrivingListener,
this.brokerConfig); this.brokerConfig);
this.brokerStats = new BrokerStats((DefaultMessageStore) this.messageStore); this.brokerStats = new BrokerStats((DefaultMessageStore)this.messageStore);
//load plugin //load plugin
MessageStorePluginContext context = new MessageStorePluginContext(messageStoreConfig, brokerStatsManager, messageArrivingListener, brokerConfig); MessageStorePluginContext context = new MessageStorePluginContext(messageStoreConfig, brokerStatsManager, messageArrivingListener, brokerConfig);
this.messageStore = MessageStoreFactory.build(context, this.messageStore); this.messageStore = MessageStoreFactory.build(context, this.messageStore);
...@@ -196,44 +219,43 @@ public class BrokerController { ...@@ -196,44 +219,43 @@ public class BrokerController {
if (result) { if (result) {
this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.clientHousekeepingService); this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.clientHousekeepingService);
NettyServerConfig fastConfig = (NettyServerConfig) this.nettyServerConfig.clone(); NettyServerConfig fastConfig = (NettyServerConfig)this.nettyServerConfig.clone();
fastConfig.setListenPort(nettyServerConfig.getListenPort() - 2); fastConfig.setListenPort(nettyServerConfig.getListenPort() - 2);
this.fastRemotingServer = new NettyRemotingServer(fastConfig, this.clientHousekeepingService); this.fastRemotingServer = new NettyRemotingServer(fastConfig, this.clientHousekeepingService);
this.sendMessageExecutor = new BrokerFixedThreadPoolExecutor( this.sendMessageExecutor = new BrokerFixedThreadPoolExecutor(
this.brokerConfig.getSendMessageThreadPoolNums(), this.brokerConfig.getSendMessageThreadPoolNums(),
this.brokerConfig.getSendMessageThreadPoolNums(), this.brokerConfig.getSendMessageThreadPoolNums(),
1000 * 60, 1000 * 60,
TimeUnit.MILLISECONDS, TimeUnit.MILLISECONDS,
this.sendThreadPoolQueue, this.sendThreadPoolQueue,
new ThreadFactoryImpl("SendMessageThread_")); new ThreadFactoryImpl("SendMessageThread_"));
this.pullMessageExecutor = new BrokerFixedThreadPoolExecutor( this.pullMessageExecutor = new BrokerFixedThreadPoolExecutor(
this.brokerConfig.getPullMessageThreadPoolNums(), this.brokerConfig.getPullMessageThreadPoolNums(),
this.brokerConfig.getPullMessageThreadPoolNums(), this.brokerConfig.getPullMessageThreadPoolNums(),
1000 * 60, 1000 * 60,
TimeUnit.MILLISECONDS, TimeUnit.MILLISECONDS,
this.pullThreadPoolQueue, this.pullThreadPoolQueue,
new ThreadFactoryImpl("PullMessageThread_")); new ThreadFactoryImpl("PullMessageThread_"));
this.adminBrokerExecutor = this.adminBrokerExecutor =
Executors.newFixedThreadPool(this.brokerConfig.getAdminBrokerThreadPoolNums(), new ThreadFactoryImpl( Executors.newFixedThreadPool(this.brokerConfig.getAdminBrokerThreadPoolNums(), new ThreadFactoryImpl(
"AdminBrokerThread_")); "AdminBrokerThread_"));
this.clientManageExecutor = new ThreadPoolExecutor( this.clientManageExecutor = new ThreadPoolExecutor(
this.brokerConfig.getClientManageThreadPoolNums(), this.brokerConfig.getClientManageThreadPoolNums(),
this.brokerConfig.getClientManageThreadPoolNums(), this.brokerConfig.getClientManageThreadPoolNums(),
1000 * 60, 1000 * 60,
TimeUnit.MILLISECONDS, TimeUnit.MILLISECONDS,
this.clientManagerThreadPoolQueue, this.clientManagerThreadPoolQueue,
new ThreadFactoryImpl("ClientManageThread_")); new ThreadFactoryImpl("ClientManageThread_"));
this.consumerManageExecutor = this.consumerManageExecutor =
Executors.newFixedThreadPool(this.brokerConfig.getConsumerManageThreadPoolNums(), new ThreadFactoryImpl( Executors.newFixedThreadPool(this.brokerConfig.getConsumerManageThreadPoolNums(), new ThreadFactoryImpl(
"ConsumerManageThread_")); "ConsumerManageThread_"));
this.registerProcessor(); this.registerProcessor();
// TODO remove in future // TODO remove in future
final long initialDelay = UtilAll.computNextMorningTimeMillis() - System.currentTimeMillis(); final long initialDelay = UtilAll.computNextMorningTimeMillis() - System.currentTimeMillis();
final long period = 1000 * 60 * 60 * 24; final long period = 1000 * 60 * 60 * 24;
...@@ -259,7 +281,6 @@ public class BrokerController { ...@@ -259,7 +281,6 @@ public class BrokerController {
} }
}, 1000 * 10, this.brokerConfig.getFlushConsumerOffsetInterval(), TimeUnit.MILLISECONDS); }, 1000 * 10, this.brokerConfig.getFlushConsumerOffsetInterval(), TimeUnit.MILLISECONDS);
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override @Override
public void run() { public void run() {
...@@ -399,7 +420,6 @@ public class BrokerController { ...@@ -399,7 +420,6 @@ public class BrokerController {
this.fastRemotingServer.registerProcessor(RequestCode.UPDATE_CONSUMER_OFFSET, consumerManageProcessor, this.consumerManageExecutor); this.fastRemotingServer.registerProcessor(RequestCode.UPDATE_CONSUMER_OFFSET, consumerManageProcessor, this.consumerManageExecutor);
this.fastRemotingServer.registerProcessor(RequestCode.QUERY_CONSUMER_OFFSET, consumerManageProcessor, this.consumerManageExecutor); this.fastRemotingServer.registerProcessor(RequestCode.QUERY_CONSUMER_OFFSET, consumerManageProcessor, this.consumerManageExecutor);
/** /**
* EndTransactionProcessor * EndTransactionProcessor
*/ */
...@@ -446,7 +466,8 @@ public class BrokerController { ...@@ -446,7 +466,8 @@ public class BrokerController {
slowTimeMills = this.messageStore.now() - rt.getCreateTimestamp(); slowTimeMills = this.messageStore.now() - rt.getCreateTimestamp();
} }
if (slowTimeMills < 0) slowTimeMills = 0; if (slowTimeMills < 0)
slowTimeMills = 0;
return slowTimeMills; return slowTimeMills;
} }
...@@ -577,10 +598,10 @@ public class BrokerController { ...@@ -577,10 +598,10 @@ public class BrokerController {
private void unregisterBrokerAll() { private void unregisterBrokerAll() {
this.brokerOuterAPI.unregisterBrokerAll( this.brokerOuterAPI.unregisterBrokerAll(
this.brokerConfig.getBrokerClusterName(), this.brokerConfig.getBrokerClusterName(),
this.getBrokerAddr(), this.getBrokerAddr(),
this.brokerConfig.getBrokerName(), this.brokerConfig.getBrokerName(),
this.brokerConfig.getBrokerId()); this.brokerConfig.getBrokerId());
} }
public String getBrokerAddr() { public String getBrokerAddr() {
...@@ -643,27 +664,27 @@ public class BrokerController { ...@@ -643,27 +664,27 @@ public class BrokerController {
TopicConfigSerializeWrapper topicConfigWrapper = this.getTopicConfigManager().buildTopicConfigSerializeWrapper(); TopicConfigSerializeWrapper topicConfigWrapper = this.getTopicConfigManager().buildTopicConfigSerializeWrapper();
if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission()) if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission())
|| !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) {
ConcurrentHashMap<String, TopicConfig> topicConfigTable = new ConcurrentHashMap<String, TopicConfig>(); ConcurrentHashMap<String, TopicConfig> topicConfigTable = new ConcurrentHashMap<String, TopicConfig>();
for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) { for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) {
TopicConfig tmp = TopicConfig tmp =
new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), topicConfig.getWriteQueueNums(), new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), topicConfig.getWriteQueueNums(),
this.brokerConfig.getBrokerPermission()); this.brokerConfig.getBrokerPermission());
topicConfigTable.put(topicConfig.getTopicName(), tmp); topicConfigTable.put(topicConfig.getTopicName(), tmp);
} }
topicConfigWrapper.setTopicConfigTable(topicConfigTable); topicConfigWrapper.setTopicConfigTable(topicConfigTable);
} }
RegisterBrokerResult registerBrokerResult = this.brokerOuterAPI.registerBrokerAll( RegisterBrokerResult registerBrokerResult = this.brokerOuterAPI.registerBrokerAll(
this.brokerConfig.getBrokerClusterName(), this.brokerConfig.getBrokerClusterName(),
this.getBrokerAddr(), this.getBrokerAddr(),
this.brokerConfig.getBrokerName(), this.brokerConfig.getBrokerName(),
this.brokerConfig.getBrokerId(), this.brokerConfig.getBrokerId(),
this.getHAServerAddr(), this.getHAServerAddr(),
topicConfigWrapper, topicConfigWrapper,
this.filterServerManager.buildNewFilterServerList(), this.filterServerManager.buildNewFilterServerList(),
oneway, oneway,
this.brokerConfig.getRegisterBrokerTimeoutMills()); this.brokerConfig.getRegisterBrokerTimeoutMills());
if (registerBrokerResult != null) { if (registerBrokerResult != null) {
if (this.updateMasterHAServerAddrPeriodically && registerBrokerResult.getHaServerAddr() != null) { if (this.updateMasterHAServerAddrPeriodically && registerBrokerResult.getHaServerAddr() != null) {
......
...@@ -6,45 +6,39 @@ ...@@ -6,45 +6,39 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker; package org.apache.rocketmq.broker;
import java.io.File; import java.io.File;
public class BrokerPathConfigHelper { public class BrokerPathConfigHelper {
private static String brokerConfigPath = System.getProperty("user.home") + File.separator + "store" private static String brokerConfigPath = System.getProperty("user.home") + File.separator + "store"
+ File.separator + "config" + File.separator + "broker.properties"; + File.separator + "config" + File.separator + "broker.properties";
public static String getBrokerConfigPath() { public static String getBrokerConfigPath() {
return brokerConfigPath; return brokerConfigPath;
} }
public static void setBrokerConfigPath(String path) { public static void setBrokerConfigPath(String path) {
brokerConfigPath = path; brokerConfigPath = path;
} }
public static String getTopicConfigPath(final String rootDir) { public static String getTopicConfigPath(final String rootDir) {
return rootDir + File.separator + "config" + File.separator + "topics.json"; return rootDir + File.separator + "config" + File.separator + "topics.json";
} }
public static String getConsumerOffsetPath(final String rootDir) { public static String getConsumerOffsetPath(final String rootDir) {
return rootDir + File.separator + "config" + File.separator + "consumerOffset.json"; return rootDir + File.separator + "config" + File.separator + "consumerOffset.json";
} }
public static String getSubscriptionGroupPath(final String rootDir) { public static String getSubscriptionGroupPath(final String rootDir) {
return rootDir + File.separator + "config" + File.separator + "subscriptionGroup.json"; return rootDir + File.separator + "config" + File.separator + "subscriptionGroup.json";
} }
......
...@@ -18,6 +18,15 @@ package org.apache.rocketmq.broker; ...@@ -18,6 +18,15 @@ package org.apache.rocketmq.broker;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.classic.joran.JoranConfigurator;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.apache.rocketmq.common.BrokerConfig; import org.apache.rocketmq.common.BrokerConfig;
import org.apache.rocketmq.common.MQVersion; import org.apache.rocketmq.common.MQVersion;
import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.MixAll;
...@@ -30,20 +39,9 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; ...@@ -30,20 +39,9 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.srvutil.ServerUtil; import org.apache.rocketmq.srvutil.ServerUtil;
import org.apache.rocketmq.store.config.BrokerRole; import org.apache.rocketmq.store.config.BrokerRole;
import org.apache.rocketmq.store.config.MessageStoreConfig; import org.apache.rocketmq.store.config.MessageStoreConfig;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
public class BrokerStartup { public class BrokerStartup {
public static Properties properties = null; public static Properties properties = null;
public static CommandLine commandLine = null; public static CommandLine commandLine = null;
...@@ -58,7 +56,7 @@ public class BrokerStartup { ...@@ -58,7 +56,7 @@ public class BrokerStartup {
try { try {
controller.start(); controller.start();
String tip = "The broker[" + controller.getBrokerConfig().getBrokerName() + ", " String tip = "The broker[" + controller.getBrokerConfig().getBrokerName() + ", "
+ controller.getBrokerAddr() + "] boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer(); + controller.getBrokerAddr() + "] boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer();
if (null != controller.getBrokerConfig().getNamesrvAddr()) { if (null != controller.getBrokerConfig().getNamesrvAddr()) {
tip += " and name server is " + controller.getBrokerConfig().getNamesrvAddr(); tip += " and name server is " + controller.getBrokerConfig().getNamesrvAddr();
...@@ -89,7 +87,7 @@ public class BrokerStartup { ...@@ -89,7 +87,7 @@ public class BrokerStartup {
//PackageConflictDetect.detectFastjson(); //PackageConflictDetect.detectFastjson();
Options options = ServerUtil.buildCommandlineOptions(new Options()); Options options = ServerUtil.buildCommandlineOptions(new Options());
commandLine = ServerUtil.parseCmdLine("mqbroker", args, buildCommandlineOptions(options), commandLine = ServerUtil.parseCmdLine("mqbroker", args, buildCommandlineOptions(options),
new PosixParser()); new PosixParser());
if (null == commandLine) { if (null == commandLine) {
System.exit(-1); System.exit(-1);
} }
...@@ -142,7 +140,7 @@ public class BrokerStartup { ...@@ -142,7 +140,7 @@ public class BrokerStartup {
if (null == brokerConfig.getRocketmqHome()) { if (null == brokerConfig.getRocketmqHome()) {
System.out.printf("Please set the " + MixAll.ROCKETMQ_HOME_ENV System.out.printf("Please set the " + MixAll.ROCKETMQ_HOME_ENV
+ " variable in your environment to match the location of the RocketMQ installation"); + " variable in your environment to match the location of the RocketMQ installation");
System.exit(-2); System.exit(-2);
} }
...@@ -157,13 +155,12 @@ public class BrokerStartup { ...@@ -157,13 +155,12 @@ public class BrokerStartup {
} }
} catch (Exception e) { } catch (Exception e) {
System.out.printf( System.out.printf(
"The Name Server Address[%s] illegal, please set it as follows, \"127.0.0.1:9876;192.168.0.1:9876\"%n", "The Name Server Address[%s] illegal, please set it as follows, \"127.0.0.1:9876;192.168.0.1:9876\"%n",
namesrvAddr); namesrvAddr);
System.exit(-3); System.exit(-3);
} }
} }
switch (messageStoreConfig.getBrokerRole()) { switch (messageStoreConfig.getBrokerRole()) {
case ASYNC_MASTER: case ASYNC_MASTER:
case SYNC_MASTER: case SYNC_MASTER:
...@@ -181,7 +178,7 @@ public class BrokerStartup { ...@@ -181,7 +178,7 @@ public class BrokerStartup {
} }
messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1); messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1);
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator(); JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc); configurator.setContext(lc);
lc.reset(); lc.reset();
...@@ -194,10 +191,10 @@ public class BrokerStartup { ...@@ -194,10 +191,10 @@ public class BrokerStartup {
MixAll.printObjectProperties(log, messageStoreConfig); MixAll.printObjectProperties(log, messageStoreConfig);
final BrokerController controller = new BrokerController(// final BrokerController controller = new BrokerController(//
brokerConfig, // brokerConfig, //
nettyServerConfig, // nettyServerConfig, //
nettyClientConfig, // nettyClientConfig, //
messageStoreConfig); messageStoreConfig);
// remember all configs to prevent discard // remember all configs to prevent discard
controller.getConfiguration().registerConfig(properties); controller.getConfiguration().registerConfig(properties);
......
...@@ -6,19 +6,18 @@ ...@@ -6,19 +6,18 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import org.apache.rocketmq.remoting.protocol.LanguageCode;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import org.apache.rocketmq.remoting.protocol.LanguageCode;
public class ClientChannelInfo { public class ClientChannelInfo {
private final Channel channel; private final Channel channel;
...@@ -27,12 +26,10 @@ public class ClientChannelInfo { ...@@ -27,12 +26,10 @@ public class ClientChannelInfo {
private final int version; private final int version;
private volatile long lastUpdateTimestamp = System.currentTimeMillis(); private volatile long lastUpdateTimestamp = System.currentTimeMillis();
public ClientChannelInfo(Channel channel) { public ClientChannelInfo(Channel channel) {
this(channel, null, null, 0); this(channel, null, null, 0);
} }
public ClientChannelInfo(Channel channel, String clientId, LanguageCode language, int version) { public ClientChannelInfo(Channel channel, String clientId, LanguageCode language, int version) {
this.channel = channel; this.channel = channel;
this.clientId = clientId; this.clientId = clientId;
...@@ -40,37 +37,30 @@ public class ClientChannelInfo { ...@@ -40,37 +37,30 @@ public class ClientChannelInfo {
this.version = version; this.version = version;
} }
public Channel getChannel() { public Channel getChannel() {
return channel; return channel;
} }
public String getClientId() { public String getClientId() {
return clientId; return clientId;
} }
public LanguageCode getLanguage() { public LanguageCode getLanguage() {
return language; return language;
} }
public int getVersion() { public int getVersion() {
return version; return version;
} }
public long getLastUpdateTimestamp() { public long getLastUpdateTimestamp() {
return lastUpdateTimestamp; return lastUpdateTimestamp;
} }
public void setLastUpdateTimestamp(long lastUpdateTimestamp) { public void setLastUpdateTimestamp(long lastUpdateTimestamp) {
this.lastUpdateTimestamp = lastUpdateTimestamp; this.lastUpdateTimestamp = lastUpdateTimestamp;
} }
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
...@@ -78,12 +68,11 @@ public class ClientChannelInfo { ...@@ -78,12 +68,11 @@ public class ClientChannelInfo {
result = prime * result + ((channel == null) ? 0 : channel.hashCode()); result = prime * result + ((channel == null) ? 0 : channel.hashCode());
result = prime * result + ((clientId == null) ? 0 : clientId.hashCode()); result = prime * result + ((clientId == null) ? 0 : clientId.hashCode());
result = prime * result + ((language == null) ? 0 : language.hashCode()); result = prime * result + ((language == null) ? 0 : language.hashCode());
result = prime * result + (int) (lastUpdateTimestamp ^ (lastUpdateTimestamp >>> 32)); result = prime * result + (int)(lastUpdateTimestamp ^ (lastUpdateTimestamp >>> 32));
result = prime * result + version; result = prime * result + version;
return result; return result;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
...@@ -92,7 +81,7 @@ public class ClientChannelInfo { ...@@ -92,7 +81,7 @@ public class ClientChannelInfo {
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
ClientChannelInfo other = (ClientChannelInfo) obj; ClientChannelInfo other = (ClientChannelInfo)obj;
if (channel == null) { if (channel == null) {
if (other.channel != null) if (other.channel != null)
return false; return false;
...@@ -103,10 +92,9 @@ public class ClientChannelInfo { ...@@ -103,10 +92,9 @@ public class ClientChannelInfo {
return true; return true;
} }
@Override @Override
public String toString() { public String toString() {
return "ClientChannelInfo [channel=" + channel + ", clientId=" + clientId + ", language=" + language return "ClientChannelInfo [channel=" + channel + ", clientId=" + clientId + ", language=" + language
+ ", version=" + version + ", lastUpdateTimestamp=" + lastUpdateTimestamp + "]"; + ", version=" + version + ", lastUpdateTimestamp=" + lastUpdateTimestamp + "]";
} }
} }
...@@ -6,42 +6,38 @@ ...@@ -6,42 +6,38 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import io.netty.channel.Channel;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.common.ThreadFactoryImpl; import org.apache.rocketmq.common.ThreadFactoryImpl;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.ChannelEventListener; import org.apache.rocketmq.remoting.ChannelEventListener;
import io.netty.channel.Channel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ClientHousekeepingService implements ChannelEventListener { public class ClientHousekeepingService implements ChannelEventListener {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
private ScheduledExecutorService scheduledExecutorService = Executors private ScheduledExecutorService scheduledExecutorService = Executors
.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("ClientHousekeepingScheduledThread")); .newSingleThreadScheduledExecutor(new ThreadFactoryImpl("ClientHousekeepingScheduledThread"));
public ClientHousekeepingService(final BrokerController brokerController) { public ClientHousekeepingService(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
public void start() { public void start() {
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
...@@ -71,7 +67,6 @@ public class ClientHousekeepingService implements ChannelEventListener { ...@@ -71,7 +67,6 @@ public class ClientHousekeepingService implements ChannelEventListener {
} }
@Override @Override
public void onChannelClose(String remoteAddr, Channel channel) { public void onChannelClose(String remoteAddr, Channel channel) {
this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
...@@ -79,7 +74,6 @@ public class ClientHousekeepingService implements ChannelEventListener { ...@@ -79,7 +74,6 @@ public class ClientHousekeepingService implements ChannelEventListener {
this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel);
} }
@Override @Override
public void onChannelException(String remoteAddr, Channel channel) { public void onChannelException(String remoteAddr, Channel channel) {
this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
...@@ -87,7 +81,6 @@ public class ClientHousekeepingService implements ChannelEventListener { ...@@ -87,7 +81,6 @@ public class ClientHousekeepingService implements ChannelEventListener {
this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel);
} }
@Override @Override
public void onChannelIdle(String remoteAddr, Channel channel) { public void onChannelIdle(String remoteAddr, Channel channel) {
this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
......
...@@ -16,45 +16,41 @@ ...@@ -16,45 +16,41 @@
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConsumerGroupInfo { public class ConsumerGroupInfo {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final String groupName; private final String groupName;
private final ConcurrentHashMap<String/* Topic */, SubscriptionData> subscriptionTable = private final ConcurrentHashMap<String/* Topic */, SubscriptionData> subscriptionTable =
new ConcurrentHashMap<String, SubscriptionData>(); new ConcurrentHashMap<String, SubscriptionData>();
private final ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable = private final ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable =
new ConcurrentHashMap<Channel, ClientChannelInfo>(16); new ConcurrentHashMap<Channel, ClientChannelInfo>(16);
private volatile ConsumeType consumeType; private volatile ConsumeType consumeType;
private volatile MessageModel messageModel; private volatile MessageModel messageModel;
private volatile ConsumeFromWhere consumeFromWhere; private volatile ConsumeFromWhere consumeFromWhere;
private volatile long lastUpdateTimestamp = System.currentTimeMillis(); private volatile long lastUpdateTimestamp = System.currentTimeMillis();
public ConsumerGroupInfo(String groupName, ConsumeType consumeType, MessageModel messageModel, public ConsumerGroupInfo(String groupName, ConsumeType consumeType, MessageModel messageModel,
ConsumeFromWhere consumeFromWhere) { ConsumeFromWhere consumeFromWhere) {
this.groupName = groupName; this.groupName = groupName;
this.consumeType = consumeType; this.consumeType = consumeType;
this.messageModel = messageModel; this.messageModel = messageModel;
this.consumeFromWhere = consumeFromWhere; this.consumeFromWhere = consumeFromWhere;
} }
public ClientChannelInfo findChannel(final String clientId) { public ClientChannelInfo findChannel(final String clientId) {
Iterator<Entry<Channel, ClientChannelInfo>> it = this.channelInfoTable.entrySet().iterator(); Iterator<Entry<Channel, ClientChannelInfo>> it = this.channelInfoTable.entrySet().iterator();
while (it.hasNext()) { while (it.hasNext()) {
...@@ -67,17 +63,14 @@ public class ConsumerGroupInfo { ...@@ -67,17 +63,14 @@ public class ConsumerGroupInfo {
return null; return null;
} }
public ConcurrentHashMap<String, SubscriptionData> getSubscriptionTable() { public ConcurrentHashMap<String, SubscriptionData> getSubscriptionTable() {
return subscriptionTable; return subscriptionTable;
} }
public ConcurrentHashMap<Channel, ClientChannelInfo> getChannelInfoTable() { public ConcurrentHashMap<Channel, ClientChannelInfo> getChannelInfoTable() {
return channelInfoTable; return channelInfoTable;
} }
public List<Channel> getAllChannel() { public List<Channel> getAllChannel() {
List<Channel> result = new ArrayList<Channel>(); List<Channel> result = new ArrayList<Channel>();
...@@ -86,7 +79,6 @@ public class ConsumerGroupInfo { ...@@ -86,7 +79,6 @@ public class ConsumerGroupInfo {
return result; return result;
} }
public List<String> getAllClientId() { public List<String> getAllClientId() {
List<String> result = new ArrayList<String>(); List<String> result = new ArrayList<String>();
...@@ -101,7 +93,6 @@ public class ConsumerGroupInfo { ...@@ -101,7 +93,6 @@ public class ConsumerGroupInfo {
return result; return result;
} }
public void unregisterChannel(final ClientChannelInfo clientChannelInfo) { public void unregisterChannel(final ClientChannelInfo clientChannelInfo) {
ClientChannelInfo old = this.channelInfoTable.remove(clientChannelInfo.getChannel()); ClientChannelInfo old = this.channelInfoTable.remove(clientChannelInfo.getChannel());
if (old != null) { if (old != null) {
...@@ -109,13 +100,12 @@ public class ConsumerGroupInfo { ...@@ -109,13 +100,12 @@ public class ConsumerGroupInfo {
} }
} }
public boolean doChannelCloseEvent(final String remoteAddr, final Channel channel) { public boolean doChannelCloseEvent(final String remoteAddr, final Channel channel) {
final ClientChannelInfo info = this.channelInfoTable.remove(channel); final ClientChannelInfo info = this.channelInfoTable.remove(channel);
if (info != null) { if (info != null) {
log.warn( log.warn(
"NETTY EVENT: remove not active channel[{}] from ConsumerGroupInfo groupChannelTable, consumer group: {}", "NETTY EVENT: remove not active channel[{}] from ConsumerGroupInfo groupChannelTable, consumer group: {}",
info.toString(), groupName); info.toString(), groupName);
return true; return true;
} }
...@@ -123,7 +113,7 @@ public class ConsumerGroupInfo { ...@@ -123,7 +113,7 @@ public class ConsumerGroupInfo {
} }
public boolean updateChannel(final ClientChannelInfo infoNew, ConsumeType consumeType, public boolean updateChannel(final ClientChannelInfo infoNew, ConsumeType consumeType,
MessageModel messageModel, ConsumeFromWhere consumeFromWhere) { MessageModel messageModel, ConsumeFromWhere consumeFromWhere) {
boolean updated = false; boolean updated = false;
this.consumeType = consumeType; this.consumeType = consumeType;
this.messageModel = messageModel; this.messageModel = messageModel;
...@@ -134,7 +124,7 @@ public class ConsumerGroupInfo { ...@@ -134,7 +124,7 @@ public class ConsumerGroupInfo {
ClientChannelInfo prev = this.channelInfoTable.put(infoNew.getChannel(), infoNew); ClientChannelInfo prev = this.channelInfoTable.put(infoNew.getChannel(), infoNew);
if (null == prev) { if (null == prev) {
log.info("new consumer connected, group: {} {} {} channel: {}", this.groupName, consumeType, log.info("new consumer connected, group: {} {} {} channel: {}", this.groupName, consumeType,
messageModel, infoNew.toString()); messageModel, infoNew.toString());
updated = true; updated = true;
} }
...@@ -142,9 +132,9 @@ public class ConsumerGroupInfo { ...@@ -142,9 +132,9 @@ public class ConsumerGroupInfo {
} else { } else {
if (!infoOld.getClientId().equals(infoNew.getClientId())) { if (!infoOld.getClientId().equals(infoNew.getClientId())) {
log.error("[BUG] consumer channel exist in broker, but clientId not equal. GROUP: {} OLD: {} NEW: {} ", log.error("[BUG] consumer channel exist in broker, but clientId not equal. GROUP: {} OLD: {} NEW: {} ",
this.groupName, this.groupName,
infoOld.toString(), infoOld.toString(),
infoNew.toString()); infoNew.toString());
this.channelInfoTable.put(infoNew.getChannel(), infoNew); this.channelInfoTable.put(infoNew.getChannel(), infoNew);
} }
} }
...@@ -155,7 +145,6 @@ public class ConsumerGroupInfo { ...@@ -155,7 +145,6 @@ public class ConsumerGroupInfo {
return updated; return updated;
} }
public boolean updateSubscription(final Set<SubscriptionData> subList) { public boolean updateSubscription(final Set<SubscriptionData> subList) {
boolean updated = false; boolean updated = false;
...@@ -166,15 +155,15 @@ public class ConsumerGroupInfo { ...@@ -166,15 +155,15 @@ public class ConsumerGroupInfo {
if (null == prev) { if (null == prev) {
updated = true; updated = true;
log.info("subscription changed, add new topic, group: {} {}", log.info("subscription changed, add new topic, group: {} {}",
this.groupName, this.groupName,
sub.toString()); sub.toString());
} }
} else if (sub.getSubVersion() > old.getSubVersion()) { } else if (sub.getSubVersion() > old.getSubVersion()) {
if (this.consumeType == ConsumeType.CONSUME_PASSIVELY) { if (this.consumeType == ConsumeType.CONSUME_PASSIVELY) {
log.info("subscription changed, group: {} OLD: {} NEW: {}", log.info("subscription changed, group: {} OLD: {} NEW: {}",
this.groupName, this.groupName,
old.toString(), old.toString(),
sub.toString() sub.toString()
); );
} }
...@@ -182,7 +171,6 @@ public class ConsumerGroupInfo { ...@@ -182,7 +171,6 @@ public class ConsumerGroupInfo {
} }
} }
Iterator<Entry<String, SubscriptionData>> it = this.subscriptionTable.entrySet().iterator(); Iterator<Entry<String, SubscriptionData>> it = this.subscriptionTable.entrySet().iterator();
while (it.hasNext()) { while (it.hasNext()) {
Entry<String, SubscriptionData> next = it.next(); Entry<String, SubscriptionData> next = it.next();
...@@ -198,9 +186,9 @@ public class ConsumerGroupInfo { ...@@ -198,9 +186,9 @@ public class ConsumerGroupInfo {
if (!exist) { if (!exist) {
log.warn("subscription changed, group: {} remove topic {} {}", log.warn("subscription changed, group: {} remove topic {} {}",
this.groupName, this.groupName,
oldTopic, oldTopic,
next.getValue().toString() next.getValue().toString()
); );
it.remove(); it.remove();
...@@ -213,57 +201,46 @@ public class ConsumerGroupInfo { ...@@ -213,57 +201,46 @@ public class ConsumerGroupInfo {
return updated; return updated;
} }
public Set<String> getSubscribeTopics() { public Set<String> getSubscribeTopics() {
return subscriptionTable.keySet(); return subscriptionTable.keySet();
} }
public SubscriptionData findSubscriptionData(final String topic) { public SubscriptionData findSubscriptionData(final String topic) {
return this.subscriptionTable.get(topic); return this.subscriptionTable.get(topic);
} }
public ConsumeType getConsumeType() { public ConsumeType getConsumeType() {
return consumeType; return consumeType;
} }
public void setConsumeType(ConsumeType consumeType) { public void setConsumeType(ConsumeType consumeType) {
this.consumeType = consumeType; this.consumeType = consumeType;
} }
public MessageModel getMessageModel() { public MessageModel getMessageModel() {
return messageModel; return messageModel;
} }
public void setMessageModel(MessageModel messageModel) { public void setMessageModel(MessageModel messageModel) {
this.messageModel = messageModel; this.messageModel = messageModel;
} }
public String getGroupName() { public String getGroupName() {
return groupName; return groupName;
} }
public long getLastUpdateTimestamp() { public long getLastUpdateTimestamp() {
return lastUpdateTimestamp; return lastUpdateTimestamp;
} }
public void setLastUpdateTimestamp(long lastUpdateTimestamp) { public void setLastUpdateTimestamp(long lastUpdateTimestamp) {
this.lastUpdateTimestamp = lastUpdateTimestamp; this.lastUpdateTimestamp = lastUpdateTimestamp;
} }
public ConsumeFromWhere getConsumeFromWhere() { public ConsumeFromWhere getConsumeFromWhere() {
return consumeFromWhere; return consumeFromWhere;
} }
public void setConsumeFromWhere(ConsumeFromWhere consumeFromWhere) { public void setConsumeFromWhere(ConsumeFromWhere consumeFromWhere) {
this.consumeFromWhere = consumeFromWhere; this.consumeFromWhere = consumeFromWhere;
} }
......
...@@ -6,21 +6,19 @@ ...@@ -6,21 +6,19 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import java.util.List; import java.util.List;
public interface ConsumerIdsChangeListener { public interface ConsumerIdsChangeListener {
void consumerIdsChanged(final String group, final List<Channel> channels); void consumerIdsChanged(final String group, final List<Channel> channels);
} }
...@@ -16,6 +16,12 @@ ...@@ -16,6 +16,12 @@
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import io.netty.channel.Channel;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType; import org.apache.rocketmq.common.protocol.heartbeat.ConsumeType;
...@@ -23,22 +29,14 @@ import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; ...@@ -23,22 +29,14 @@ import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import org.apache.rocketmq.remoting.common.RemotingHelper; import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.common.RemotingUtil; import org.apache.rocketmq.remoting.common.RemotingUtil;
import io.netty.channel.Channel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class ConsumerManager { public class ConsumerManager {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120; private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120;
private final ConcurrentHashMap<String/* Group */, ConsumerGroupInfo> consumerTable = private final ConcurrentHashMap<String/* Group */, ConsumerGroupInfo> consumerTable =
new ConcurrentHashMap<String, ConsumerGroupInfo>(1024); new ConcurrentHashMap<String, ConsumerGroupInfo>(1024);
private final ConsumerIdsChangeListener consumerIdsChangeListener; private final ConsumerIdsChangeListener consumerIdsChangeListener;
public ConsumerManager(final ConsumerIdsChangeListener consumerIdsChangeListener) { public ConsumerManager(final ConsumerIdsChangeListener consumerIdsChangeListener) {
...@@ -86,7 +84,7 @@ public class ConsumerManager { ...@@ -86,7 +84,7 @@ public class ConsumerManager {
ConsumerGroupInfo remove = this.consumerTable.remove(next.getKey()); ConsumerGroupInfo remove = this.consumerTable.remove(next.getKey());
if (remove != null) { if (remove != null) {
log.info("unregister consumer ok, no any connection, and remove consumer group, {}", log.info("unregister consumer ok, no any connection, and remove consumer group, {}",
next.getKey()); next.getKey());
} }
} }
...@@ -96,8 +94,8 @@ public class ConsumerManager { ...@@ -96,8 +94,8 @@ public class ConsumerManager {
} }
public boolean registerConsumer(final String group, final ClientChannelInfo clientChannelInfo, public boolean registerConsumer(final String group, final ClientChannelInfo clientChannelInfo,
ConsumeType consumeType, MessageModel messageModel, ConsumeFromWhere consumeFromWhere, ConsumeType consumeType, MessageModel messageModel, ConsumeFromWhere consumeFromWhere,
final Set<SubscriptionData> subList, boolean isNotifyConsumerIdsChangedEnable) { final Set<SubscriptionData> subList, boolean isNotifyConsumerIdsChangedEnable) {
ConsumerGroupInfo consumerGroupInfo = this.consumerTable.get(group); ConsumerGroupInfo consumerGroupInfo = this.consumerTable.get(group);
if (null == consumerGroupInfo) { if (null == consumerGroupInfo) {
...@@ -107,8 +105,8 @@ public class ConsumerManager { ...@@ -107,8 +105,8 @@ public class ConsumerManager {
} }
boolean r1 = boolean r1 =
consumerGroupInfo.updateChannel(clientChannelInfo, consumeType, messageModel, consumerGroupInfo.updateChannel(clientChannelInfo, consumeType, messageModel,
consumeFromWhere); consumeFromWhere);
boolean r2 = consumerGroupInfo.updateSubscription(subList); boolean r2 = consumerGroupInfo.updateSubscription(subList);
if (r1 || r2) { if (r1 || r2) {
...@@ -143,7 +141,7 @@ public class ConsumerManager { ...@@ -143,7 +141,7 @@ public class ConsumerManager {
String group = next.getKey(); String group = next.getKey();
ConsumerGroupInfo consumerGroupInfo = next.getValue(); ConsumerGroupInfo consumerGroupInfo = next.getValue();
ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable = ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable =
consumerGroupInfo.getChannelInfoTable(); consumerGroupInfo.getChannelInfoTable();
Iterator<Entry<Channel, ClientChannelInfo>> itChannel = channelInfoTable.entrySet().iterator(); Iterator<Entry<Channel, ClientChannelInfo>> itChannel = channelInfoTable.entrySet().iterator();
while (itChannel.hasNext()) { while (itChannel.hasNext()) {
...@@ -152,8 +150,8 @@ public class ConsumerManager { ...@@ -152,8 +150,8 @@ public class ConsumerManager {
long diff = System.currentTimeMillis() - clientChannelInfo.getLastUpdateTimestamp(); long diff = System.currentTimeMillis() - clientChannelInfo.getLastUpdateTimestamp();
if (diff > CHANNEL_EXPIRED_TIMEOUT) { if (diff > CHANNEL_EXPIRED_TIMEOUT) {
log.warn( log.warn(
"SCAN: remove expired channel from ConsumerManager consumerTable. channel={}, consumerGroup={}", "SCAN: remove expired channel from ConsumerManager consumerTable. channel={}, consumerGroup={}",
RemotingHelper.parseChannelRemoteAddr(clientChannelInfo.getChannel()), group); RemotingHelper.parseChannelRemoteAddr(clientChannelInfo.getChannel()), group);
RemotingUtil.closeChannel(clientChannelInfo.getChannel()); RemotingUtil.closeChannel(clientChannelInfo.getChannel());
itChannel.remove(); itChannel.remove();
} }
...@@ -161,8 +159,8 @@ public class ConsumerManager { ...@@ -161,8 +159,8 @@ public class ConsumerManager {
if (channelInfoTable.isEmpty()) { if (channelInfoTable.isEmpty()) {
log.warn( log.warn(
"SCAN: remove expired channel from ConsumerManager consumerTable, all clear, consumerGroup={}", "SCAN: remove expired channel from ConsumerManager consumerTable, all clear, consumerGroup={}",
group); group);
it.remove(); it.remove();
} }
} }
...@@ -174,7 +172,7 @@ public class ConsumerManager { ...@@ -174,7 +172,7 @@ public class ConsumerManager {
while (it.hasNext()) { while (it.hasNext()) {
Entry<String, ConsumerGroupInfo> entry = it.next(); Entry<String, ConsumerGroupInfo> entry = it.next();
ConcurrentHashMap<String, SubscriptionData> subscriptionTable = ConcurrentHashMap<String, SubscriptionData> subscriptionTable =
entry.getValue().getSubscriptionTable(); entry.getValue().getSubscriptionTable();
if (subscriptionTable.containsKey(topic)) { if (subscriptionTable.containsKey(topic)) {
groups.add(entry.getKey()); groups.add(entry.getKey());
} }
......
...@@ -6,31 +6,27 @@ ...@@ -6,31 +6,27 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import org.apache.rocketmq.broker.BrokerController;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import java.util.List; import java.util.List;
import org.apache.rocketmq.broker.BrokerController;
public class DefaultConsumerIdsChangeListener implements ConsumerIdsChangeListener { public class DefaultConsumerIdsChangeListener implements ConsumerIdsChangeListener {
private final BrokerController brokerController; private final BrokerController brokerController;
public DefaultConsumerIdsChangeListener(BrokerController brokerController) { public DefaultConsumerIdsChangeListener(BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
@Override @Override
public void consumerIdsChanged(String group, List<Channel> channels) { public void consumerIdsChanged(String group, List<Channel> channels) {
if (channels != null && brokerController.getBrokerConfig().isNotifyConsumerIdsChangedEnable()) { if (channels != null && brokerController.getBrokerConfig().isNotifyConsumerIdsChangedEnable()) {
......
...@@ -6,23 +6,17 @@ ...@@ -6,23 +6,17 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.client; package org.apache.rocketmq.broker.client;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.common.RemotingUtil;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
...@@ -30,7 +24,11 @@ import java.util.Map.Entry; ...@@ -30,7 +24,11 @@ import java.util.Map.Entry;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.common.RemotingUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProducerManager { public class ProducerManager {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
...@@ -38,16 +36,14 @@ public class ProducerManager { ...@@ -38,16 +36,14 @@ public class ProducerManager {
private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120; private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120;
private final Lock groupChannelLock = new ReentrantLock(); private final Lock groupChannelLock = new ReentrantLock();
private final HashMap<String /* group name */, HashMap<Channel, ClientChannelInfo>> groupChannelTable = private final HashMap<String /* group name */, HashMap<Channel, ClientChannelInfo>> groupChannelTable =
new HashMap<String, HashMap<Channel, ClientChannelInfo>>(); new HashMap<String, HashMap<Channel, ClientChannelInfo>>();
public ProducerManager() { public ProducerManager() {
} }
public HashMap<String, HashMap<Channel, ClientChannelInfo>> getGroupChannelTable() { public HashMap<String, HashMap<Channel, ClientChannelInfo>> getGroupChannelTable() {
HashMap<String /* group name */, HashMap<Channel, ClientChannelInfo>> newGroupChannelTable = HashMap<String /* group name */, HashMap<Channel, ClientChannelInfo>> newGroupChannelTable =
new HashMap<String, HashMap<Channel, ClientChannelInfo>>(); new HashMap<String, HashMap<Channel, ClientChannelInfo>>();
try { try {
if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) { if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
try { try {
...@@ -62,13 +58,12 @@ public class ProducerManager { ...@@ -62,13 +58,12 @@ public class ProducerManager {
return newGroupChannelTable; return newGroupChannelTable;
} }
public void scanNotActiveChannel() { public void scanNotActiveChannel() {
try { try {
if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) { if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
try { try {
for (final Map.Entry<String, HashMap<Channel, ClientChannelInfo>> entry : this.groupChannelTable for (final Map.Entry<String, HashMap<Channel, ClientChannelInfo>> entry : this.groupChannelTable
.entrySet()) { .entrySet()) {
final String group = entry.getKey(); final String group = entry.getKey();
final HashMap<Channel, ClientChannelInfo> chlMap = entry.getValue(); final HashMap<Channel, ClientChannelInfo> chlMap = entry.getValue();
...@@ -82,8 +77,8 @@ public class ProducerManager { ...@@ -82,8 +77,8 @@ public class ProducerManager {
if (diff > CHANNEL_EXPIRED_TIMEOUT) { if (diff > CHANNEL_EXPIRED_TIMEOUT) {
it.remove(); it.remove();
log.warn( log.warn(
"SCAN: remove expired channel[{}] from ProducerManager groupChannelTable, producer group name: {}", "SCAN: remove expired channel[{}] from ProducerManager groupChannelTable, producer group name: {}",
RemotingHelper.parseChannelRemoteAddr(info.getChannel()), group); RemotingHelper.parseChannelRemoteAddr(info.getChannel()), group);
RemotingUtil.closeChannel(info.getChannel()); RemotingUtil.closeChannel(info.getChannel());
} }
} }
...@@ -99,23 +94,22 @@ public class ProducerManager { ...@@ -99,23 +94,22 @@ public class ProducerManager {
} }
} }
public void doChannelCloseEvent(final String remoteAddr, final Channel channel) { public void doChannelCloseEvent(final String remoteAddr, final Channel channel) {
if (channel != null) { if (channel != null) {
try { try {
if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) { if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
try { try {
for (final Map.Entry<String, HashMap<Channel, ClientChannelInfo>> entry : this.groupChannelTable for (final Map.Entry<String, HashMap<Channel, ClientChannelInfo>> entry : this.groupChannelTable
.entrySet()) { .entrySet()) {
final String group = entry.getKey(); final String group = entry.getKey();
final HashMap<Channel, ClientChannelInfo> clientChannelInfoTable = final HashMap<Channel, ClientChannelInfo> clientChannelInfoTable =
entry.getValue(); entry.getValue();
final ClientChannelInfo clientChannelInfo = final ClientChannelInfo clientChannelInfo =
clientChannelInfoTable.remove(channel); clientChannelInfoTable.remove(channel);
if (clientChannelInfo != null) { if (clientChannelInfo != null) {
log.info( log.info(
"NETTY EVENT: remove channel[{}][{}] from ProducerManager groupChannelTable, producer group: {}", "NETTY EVENT: remove channel[{}][{}] from ProducerManager groupChannelTable, producer group: {}",
clientChannelInfo.toString(), remoteAddr, group); clientChannelInfo.toString(), remoteAddr, group);
} }
} }
...@@ -131,7 +125,6 @@ public class ProducerManager { ...@@ -131,7 +125,6 @@ public class ProducerManager {
} }
} }
public void registerProducer(final String group, final ClientChannelInfo clientChannelInfo) { public void registerProducer(final String group, final ClientChannelInfo clientChannelInfo) {
try { try {
ClientChannelInfo clientChannelInfoFound = null; ClientChannelInfo clientChannelInfoFound = null;
...@@ -148,7 +141,7 @@ public class ProducerManager { ...@@ -148,7 +141,7 @@ public class ProducerManager {
if (null == clientChannelInfoFound) { if (null == clientChannelInfoFound) {
channelTable.put(clientChannelInfo.getChannel(), clientChannelInfo); channelTable.put(clientChannelInfo.getChannel(), clientChannelInfo);
log.info("new producer connected, group: {} channel: {}", group, log.info("new producer connected, group: {} channel: {}", group,
clientChannelInfo.toString()); clientChannelInfo.toString());
} }
} finally { } finally {
this.groupChannelLock.unlock(); this.groupChannelLock.unlock();
...@@ -165,7 +158,6 @@ public class ProducerManager { ...@@ -165,7 +158,6 @@ public class ProducerManager {
} }
} }
public void unregisterProducer(final String group, final ClientChannelInfo clientChannelInfo) { public void unregisterProducer(final String group, final ClientChannelInfo clientChannelInfo) {
try { try {
if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) { if (this.groupChannelLock.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
...@@ -175,7 +167,7 @@ public class ProducerManager { ...@@ -175,7 +167,7 @@ public class ProducerManager {
ClientChannelInfo old = channelTable.remove(clientChannelInfo.getChannel()); ClientChannelInfo old = channelTable.remove(clientChannelInfo.getChannel());
if (old != null) { if (old != null) {
log.info("unregister a producer[{}] from groupChannelTable {}", group, log.info("unregister a producer[{}] from groupChannelTable {}", group,
clientChannelInfo.toString()); clientChannelInfo.toString());
} }
if (channelTable.isEmpty()) { if (channelTable.isEmpty()) {
......
...@@ -16,6 +16,16 @@ ...@@ -16,6 +16,16 @@
*/ */
package org.apache.rocketmq.broker.client.net; package org.apache.rocketmq.broker.client.net;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.FileRegion;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.client.ClientChannelInfo; import org.apache.rocketmq.broker.client.ClientChannelInfo;
import org.apache.rocketmq.broker.client.ConsumerGroupInfo; import org.apache.rocketmq.broker.client.ConsumerGroupInfo;
...@@ -40,21 +50,9 @@ import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; ...@@ -40,21 +50,9 @@ import org.apache.rocketmq.remoting.exception.RemotingSendRequestException;
import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; import org.apache.rocketmq.remoting.exception.RemotingTimeoutException;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.store.SelectMappedBufferResult; import org.apache.rocketmq.store.SelectMappedBufferResult;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.FileRegion;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
public class Broker2Client { public class Broker2Client {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
...@@ -64,17 +62,17 @@ public class Broker2Client { ...@@ -64,17 +62,17 @@ public class Broker2Client {
} }
public void checkProducerTransactionState( public void checkProducerTransactionState(
final Channel channel, final Channel channel,
final CheckTransactionStateRequestHeader requestHeader, final CheckTransactionStateRequestHeader requestHeader,
final SelectMappedBufferResult selectMappedBufferResult) { final SelectMappedBufferResult selectMappedBufferResult) {
RemotingCommand request = RemotingCommand request =
RemotingCommand.createRequestCommand(RequestCode.CHECK_TRANSACTION_STATE, requestHeader); RemotingCommand.createRequestCommand(RequestCode.CHECK_TRANSACTION_STATE, requestHeader);
request.markOnewayRPC(); request.markOnewayRPC();
try { try {
FileRegion fileRegion = FileRegion fileRegion =
new OneMessageTransfer(request.encodeHeader(selectMappedBufferResult.getSize()), new OneMessageTransfer(request.encodeHeader(selectMappedBufferResult.getSize()),
selectMappedBufferResult); selectMappedBufferResult);
channel.writeAndFlush(fileRegion).addListener(new ChannelFutureListener() { channel.writeAndFlush(fileRegion).addListener(new ChannelFutureListener() {
@Override @Override
public void operationComplete(ChannelFuture future) throws Exception { public void operationComplete(ChannelFuture future) throws Exception {
...@@ -91,14 +89,14 @@ public class Broker2Client { ...@@ -91,14 +89,14 @@ public class Broker2Client {
} }
public RemotingCommand callClient(final Channel channel, public RemotingCommand callClient(final Channel channel,
final RemotingCommand request final RemotingCommand request
) throws RemotingSendRequestException, RemotingTimeoutException, InterruptedException { ) throws RemotingSendRequestException, RemotingTimeoutException, InterruptedException {
return this.brokerController.getRemotingServer().invokeSync(channel, request, 10000); return this.brokerController.getRemotingServer().invokeSync(channel, request, 10000);
} }
public void notifyConsumerIdsChanged( public void notifyConsumerIdsChanged(
final Channel channel, final Channel channel,
final String consumerGroup) { final String consumerGroup) {
if (null == consumerGroup) { if (null == consumerGroup) {
log.error("notifyConsumerIdsChanged consumerGroup is null"); log.error("notifyConsumerIdsChanged consumerGroup is null");
return; return;
...@@ -107,7 +105,7 @@ public class Broker2Client { ...@@ -107,7 +105,7 @@ public class Broker2Client {
NotifyConsumerIdsChangedRequestHeader requestHeader = new NotifyConsumerIdsChangedRequestHeader(); NotifyConsumerIdsChangedRequestHeader requestHeader = new NotifyConsumerIdsChangedRequestHeader();
requestHeader.setConsumerGroup(consumerGroup); requestHeader.setConsumerGroup(consumerGroup);
RemotingCommand request = RemotingCommand request =
RemotingCommand.createRequestCommand(RequestCode.NOTIFY_CONSUMER_IDS_CHANGED, requestHeader); RemotingCommand.createRequestCommand(RequestCode.NOTIFY_CONSUMER_IDS_CHANGED, requestHeader);
try { try {
this.brokerController.getRemotingServer().invokeOneway(channel, request, 10); this.brokerController.getRemotingServer().invokeOneway(channel, request, 10);
...@@ -121,7 +119,7 @@ public class Broker2Client { ...@@ -121,7 +119,7 @@ public class Broker2Client {
} }
public RemotingCommand resetOffset(String topic, String group, long timeStamp, boolean isForce, public RemotingCommand resetOffset(String topic, String group, long timeStamp, boolean isForce,
boolean isC) { boolean isC) {
final RemotingCommand response = RemotingCommand.createResponseCommand(null); final RemotingCommand response = RemotingCommand.createResponseCommand(null);
TopicConfig topicConfig = this.brokerController.getTopicConfigManager().selectTopicConfig(topic); TopicConfig topicConfig = this.brokerController.getTopicConfigManager().selectTopicConfig(topic);
...@@ -141,7 +139,7 @@ public class Broker2Client { ...@@ -141,7 +139,7 @@ public class Broker2Client {
mq.setQueueId(i); mq.setQueueId(i);
long consumerOffset = long consumerOffset =
this.brokerController.getConsumerOffsetManager().queryOffset(group, topic, i); this.brokerController.getConsumerOffsetManager().queryOffset(group, topic, i);
if (-1 == consumerOffset) { if (-1 == consumerOffset) {
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
response.setRemark(String.format("THe consumer group <%s> not exist", group)); response.setRemark(String.format("THe consumer group <%s> not exist", group));
...@@ -173,7 +171,7 @@ public class Broker2Client { ...@@ -173,7 +171,7 @@ public class Broker2Client {
requestHeader.setGroup(group); requestHeader.setGroup(group);
requestHeader.setTimestamp(timeStamp); requestHeader.setTimestamp(timeStamp);
RemotingCommand request = RemotingCommand request =
RemotingCommand.createRequestCommand(RequestCode.RESET_CONSUMER_CLIENT_OFFSET, requestHeader); RemotingCommand.createRequestCommand(RequestCode.RESET_CONSUMER_CLIENT_OFFSET, requestHeader);
if (isC) { if (isC) {
// c++ language // c++ language
ResetOffsetBodyForC body = new ResetOffsetBodyForC(); ResetOffsetBodyForC body = new ResetOffsetBodyForC();
...@@ -188,37 +186,37 @@ public class Broker2Client { ...@@ -188,37 +186,37 @@ public class Broker2Client {
} }
ConsumerGroupInfo consumerGroupInfo = ConsumerGroupInfo consumerGroupInfo =
this.brokerController.getConsumerManager().getConsumerGroupInfo(group); this.brokerController.getConsumerManager().getConsumerGroupInfo(group);
if (consumerGroupInfo != null && !consumerGroupInfo.getAllChannel().isEmpty()) { if (consumerGroupInfo != null && !consumerGroupInfo.getAllChannel().isEmpty()) {
ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable = ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable =
consumerGroupInfo.getChannelInfoTable(); consumerGroupInfo.getChannelInfoTable();
for (Map.Entry<Channel, ClientChannelInfo> entry : channelInfoTable.entrySet()) { for (Map.Entry<Channel, ClientChannelInfo> entry : channelInfoTable.entrySet()) {
int version = entry.getValue().getVersion(); int version = entry.getValue().getVersion();
if (version >= MQVersion.Version.V3_0_7_SNAPSHOT.ordinal()) { if (version >= MQVersion.Version.V3_0_7_SNAPSHOT.ordinal()) {
try { try {
this.brokerController.getRemotingServer().invokeOneway(entry.getKey(), request, 5000); this.brokerController.getRemotingServer().invokeOneway(entry.getKey(), request, 5000);
log.info("[reset-offset] reset offset success. topic={}, group={}, clientId={}", log.info("[reset-offset] reset offset success. topic={}, group={}, clientId={}",
topic, group, entry.getValue().getClientId()); topic, group, entry.getValue().getClientId());
} catch (Exception e) { } catch (Exception e) {
log.error("[reset-offset] reset offset exception. topic={}, group={}", log.error("[reset-offset] reset offset exception. topic={}, group={}",
new Object[]{topic, group}, e); new Object[] {topic, group}, e);
} }
} else { } else {
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
response.setRemark("the client does not support this feature. version=" response.setRemark("the client does not support this feature. version="
+ MQVersion.getVersionDesc(version)); + MQVersion.getVersionDesc(version));
log.warn("[reset-offset] the client does not support this feature. version={}", log.warn("[reset-offset] the client does not support this feature. version={}",
RemotingHelper.parseChannelRemoteAddr(entry.getKey()), MQVersion.getVersionDesc(version)); RemotingHelper.parseChannelRemoteAddr(entry.getKey()), MQVersion.getVersionDesc(version));
return response; return response;
} }
} }
} else { } else {
String errorInfo = String errorInfo =
String.format("Consumer not online, so can not reset offset, Group: %s Topic: %s Timestamp: %d", String.format("Consumer not online, so can not reset offset, Group: %s Topic: %s Timestamp: %d",
requestHeader.getGroup(), requestHeader.getGroup(),
requestHeader.getTopic(), requestHeader.getTopic(),
requestHeader.getTimestamp()); requestHeader.getTimestamp());
log.error(errorInfo); log.error(errorInfo);
response.setCode(ResponseCode.CONSUMER_NOT_ONLINE); response.setCode(ResponseCode.CONSUMER_NOT_ONLINE);
response.setRemark(errorInfo); response.setRemark(errorInfo);
...@@ -236,7 +234,7 @@ public class Broker2Client { ...@@ -236,7 +234,7 @@ public class Broker2Client {
for (Entry<MessageQueue, Long> entry : table.entrySet()) { for (Entry<MessageQueue, Long> entry : table.entrySet()) {
MessageQueue mq = entry.getKey(); MessageQueue mq = entry.getKey();
MessageQueueForC tmp = MessageQueueForC tmp =
new MessageQueueForC(mq.getTopic(), mq.getBrokerName(), mq.getQueueId(), entry.getValue()); new MessageQueueForC(mq.getTopic(), mq.getBrokerName(), mq.getQueueId(), entry.getValue());
list.add(tmp); list.add(tmp);
} }
return list; return list;
...@@ -249,13 +247,13 @@ public class Broker2Client { ...@@ -249,13 +247,13 @@ public class Broker2Client {
requestHeader.setTopic(topic); requestHeader.setTopic(topic);
requestHeader.setGroup(group); requestHeader.setGroup(group);
RemotingCommand request = RemotingCommand request =
RemotingCommand.createRequestCommand(RequestCode.GET_CONSUMER_STATUS_FROM_CLIENT, RemotingCommand.createRequestCommand(RequestCode.GET_CONSUMER_STATUS_FROM_CLIENT,
requestHeader); requestHeader);
Map<String, Map<MessageQueue, Long>> consumerStatusTable = Map<String, Map<MessageQueue, Long>> consumerStatusTable =
new HashMap<String, Map<MessageQueue, Long>>(); new HashMap<String, Map<MessageQueue, Long>>();
ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable = ConcurrentHashMap<Channel, ClientChannelInfo> channelInfoTable =
this.brokerController.getConsumerManager().getConsumerGroupInfo(group).getChannelInfoTable(); this.brokerController.getConsumerManager().getConsumerGroupInfo(group).getChannelInfoTable();
if (null == channelInfoTable || channelInfoTable.isEmpty()) { if (null == channelInfoTable || channelInfoTable.isEmpty()) {
result.setCode(ResponseCode.SYSTEM_ERROR); result.setCode(ResponseCode.SYSTEM_ERROR);
result.setRemark(String.format("No Any Consumer online in the consumer group: [%s]", group)); result.setRemark(String.format("No Any Consumer online in the consumer group: [%s]", group));
...@@ -268,26 +266,26 @@ public class Broker2Client { ...@@ -268,26 +266,26 @@ public class Broker2Client {
if (version < MQVersion.Version.V3_0_7_SNAPSHOT.ordinal()) { if (version < MQVersion.Version.V3_0_7_SNAPSHOT.ordinal()) {
result.setCode(ResponseCode.SYSTEM_ERROR); result.setCode(ResponseCode.SYSTEM_ERROR);
result.setRemark("the client does not support this feature. version=" result.setRemark("the client does not support this feature. version="
+ MQVersion.getVersionDesc(version)); + MQVersion.getVersionDesc(version));
log.warn("[get-consumer-status] the client does not support this feature. version={}", log.warn("[get-consumer-status] the client does not support this feature. version={}",
RemotingHelper.parseChannelRemoteAddr(entry.getKey()), MQVersion.getVersionDesc(version)); RemotingHelper.parseChannelRemoteAddr(entry.getKey()), MQVersion.getVersionDesc(version));
return result; return result;
} else if (UtilAll.isBlank(originClientId) || originClientId.equals(clientId)) { } else if (UtilAll.isBlank(originClientId) || originClientId.equals(clientId)) {
try { try {
RemotingCommand response = RemotingCommand response =
this.brokerController.getRemotingServer().invokeSync(entry.getKey(), request, 5000); this.brokerController.getRemotingServer().invokeSync(entry.getKey(), request, 5000);
assert response != null; assert response != null;
switch (response.getCode()) { switch (response.getCode()) {
case ResponseCode.SUCCESS: { case ResponseCode.SUCCESS: {
if (response.getBody() != null) { if (response.getBody() != null) {
GetConsumerStatusBody body = GetConsumerStatusBody body =
GetConsumerStatusBody.decode(response.getBody(), GetConsumerStatusBody.decode(response.getBody(),
GetConsumerStatusBody.class); GetConsumerStatusBody.class);
consumerStatusTable.put(clientId, body.getMessageQueueTable()); consumerStatusTable.put(clientId, body.getMessageQueueTable());
log.info( log.info(
"[get-consumer-status] get consumer status success. topic={}, group={}, channelRemoteAddr={}", "[get-consumer-status] get consumer status success. topic={}, group={}, channelRemoteAddr={}",
topic, group, clientId); topic, group, clientId);
} }
} }
default: default:
...@@ -295,8 +293,8 @@ public class Broker2Client { ...@@ -295,8 +293,8 @@ public class Broker2Client {
} }
} catch (Exception e) { } catch (Exception e) {
log.error( log.error(
"[get-consumer-status] get consumer status exception. topic={}, group={}, offset={}", "[get-consumer-status] get consumer status exception. topic={}, group={}, offset={}",
new Object[]{topic, group}, e); new Object[] {topic, group}, e);
} }
if (!UtilAll.isBlank(originClientId) && originClientId.equals(clientId)) { if (!UtilAll.isBlank(originClientId) && originClientId.equals(clientId)) {
......
...@@ -16,25 +16,23 @@ ...@@ -16,25 +16,23 @@
*/ */
package org.apache.rocketmq.broker.client.rebalance; package org.apache.rocketmq.broker.client.rebalance;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.message.MessageQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.message.MessageQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RebalanceLockManager { public class RebalanceLockManager {
private static final Logger log = LoggerFactory.getLogger(LoggerName.REBALANCE_LOCK_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.REBALANCE_LOCK_LOGGER_NAME);
private final static long REBALANCE_LOCK_MAX_LIVE_TIME = Long.parseLong(System.getProperty( private final static long REBALANCE_LOCK_MAX_LIVE_TIME = Long.parseLong(System.getProperty(
"rocketmq.broker.rebalance.lockMaxLiveTime", "60000")); "rocketmq.broker.rebalance.lockMaxLiveTime", "60000"));
private final Lock lock = new ReentrantLock(); private final Lock lock = new ReentrantLock();
private final ConcurrentHashMap<String/* group */, ConcurrentHashMap<MessageQueue, LockEntry>> mqLockTable = private final ConcurrentHashMap<String/* group */, ConcurrentHashMap<MessageQueue, LockEntry>> mqLockTable =
new ConcurrentHashMap<String, ConcurrentHashMap<MessageQueue, LockEntry>>(1024); new ConcurrentHashMap<String, ConcurrentHashMap<MessageQueue, LockEntry>>(1024);
public boolean tryLock(final String group, final MessageQueue mq, final String clientId) { public boolean tryLock(final String group, final MessageQueue mq, final String clientId) {
...@@ -54,9 +52,9 @@ public class RebalanceLockManager { ...@@ -54,9 +52,9 @@ public class RebalanceLockManager {
lockEntry.setClientId(clientId); lockEntry.setClientId(clientId);
groupValue.put(mq, lockEntry); groupValue.put(mq, lockEntry);
log.info("tryLock, message queue not locked, I got it. Group: {} NewClientId: {} {}", // log.info("tryLock, message queue not locked, I got it. Group: {} NewClientId: {} {}", //
group, // group, //
clientId, // clientId, //
mq); mq);
} }
if (lockEntry.isLocked(clientId)) { if (lockEntry.isLocked(clientId)) {
...@@ -66,26 +64,24 @@ public class RebalanceLockManager { ...@@ -66,26 +64,24 @@ public class RebalanceLockManager {
String oldClientId = lockEntry.getClientId(); String oldClientId = lockEntry.getClientId();
if (lockEntry.isExpired()) { if (lockEntry.isExpired()) {
lockEntry.setClientId(clientId); lockEntry.setClientId(clientId);
lockEntry.setLastUpdateTimestamp(System.currentTimeMillis()); lockEntry.setLastUpdateTimestamp(System.currentTimeMillis());
log.warn( log.warn(
"tryLock, message queue lock expired, I got it. Group: {} OldClientId: {} NewClientId: {} {}", // "tryLock, message queue lock expired, I got it. Group: {} OldClientId: {} NewClientId: {} {}", //
group, //
oldClientId, //
clientId, //
mq);
return true;
}
log.warn(
"tryLock, message queue locked by other client. Group: {} OtherClientId: {} NewClientId: {} {}", //
group, // group, //
oldClientId, // oldClientId, //
clientId, // clientId, //
mq); mq);
return true;
}
log.warn(
"tryLock, message queue locked by other client. Group: {} OtherClientId: {} NewClientId: {} {}", //
group, //
oldClientId, //
clientId, //
mq);
return false; return false;
} finally { } finally {
this.lock.unlock(); this.lock.unlock();
...@@ -118,11 +114,10 @@ public class RebalanceLockManager { ...@@ -118,11 +114,10 @@ public class RebalanceLockManager {
} }
public Set<MessageQueue> tryLockBatch(final String group, final Set<MessageQueue> mqs, public Set<MessageQueue> tryLockBatch(final String group, final Set<MessageQueue> mqs,
final String clientId) { final String clientId) {
Set<MessageQueue> lockedMqs = new HashSet<MessageQueue>(mqs.size()); Set<MessageQueue> lockedMqs = new HashSet<MessageQueue>(mqs.size());
Set<MessageQueue> notLockedMqs = new HashSet<MessageQueue>(mqs.size()); Set<MessageQueue> notLockedMqs = new HashSet<MessageQueue>(mqs.size());
for (MessageQueue mq : mqs) { for (MessageQueue mq : mqs) {
if (this.isLocked(group, mq, clientId)) { if (this.isLocked(group, mq, clientId)) {
lockedMqs.add(mq); lockedMqs.add(mq);
...@@ -141,7 +136,6 @@ public class RebalanceLockManager { ...@@ -141,7 +136,6 @@ public class RebalanceLockManager {
this.mqLockTable.put(group, groupValue); this.mqLockTable.put(group, groupValue);
} }
for (MessageQueue mq : notLockedMqs) { for (MessageQueue mq : notLockedMqs) {
LockEntry lockEntry = groupValue.get(mq); LockEntry lockEntry = groupValue.get(mq);
if (null == lockEntry) { if (null == lockEntry) {
...@@ -149,13 +143,12 @@ public class RebalanceLockManager { ...@@ -149,13 +143,12 @@ public class RebalanceLockManager {
lockEntry.setClientId(clientId); lockEntry.setClientId(clientId);
groupValue.put(mq, lockEntry); groupValue.put(mq, lockEntry);
log.info( log.info(
"tryLockBatch, message queue not locked, I got it. Group: {} NewClientId: {} {}", // "tryLockBatch, message queue not locked, I got it. Group: {} NewClientId: {} {}", //
group, // group, //
clientId, // clientId, //
mq); mq);
} }
if (lockEntry.isLocked(clientId)) { if (lockEntry.isLocked(clientId)) {
lockEntry.setLastUpdateTimestamp(System.currentTimeMillis()); lockEntry.setLastUpdateTimestamp(System.currentTimeMillis());
lockedMqs.add(mq); lockedMqs.add(mq);
...@@ -164,27 +157,25 @@ public class RebalanceLockManager { ...@@ -164,27 +157,25 @@ public class RebalanceLockManager {
String oldClientId = lockEntry.getClientId(); String oldClientId = lockEntry.getClientId();
if (lockEntry.isExpired()) { if (lockEntry.isExpired()) {
lockEntry.setClientId(clientId); lockEntry.setClientId(clientId);
lockEntry.setLastUpdateTimestamp(System.currentTimeMillis()); lockEntry.setLastUpdateTimestamp(System.currentTimeMillis());
log.warn( log.warn(
"tryLockBatch, message queue lock expired, I got it. Group: {} OldClientId: {} NewClientId: {} {}", // "tryLockBatch, message queue lock expired, I got it. Group: {} OldClientId: {} NewClientId: {} {}", //
group, // group, //
oldClientId, // oldClientId, //
clientId, // clientId, //
mq); mq);
lockedMqs.add(mq); lockedMqs.add(mq);
continue; continue;
} }
log.warn( log.warn(
"tryLockBatch, message queue locked by other client. Group: {} OtherClientId: {} NewClientId: {} {}", // "tryLockBatch, message queue locked by other client. Group: {} OtherClientId: {} NewClientId: {} {}", //
group, // group, //
oldClientId, // oldClientId, //
clientId, // clientId, //
mq); mq);
} }
} finally { } finally {
this.lock.unlock(); this.lock.unlock();
...@@ -209,27 +200,27 @@ public class RebalanceLockManager { ...@@ -209,27 +200,27 @@ public class RebalanceLockManager {
if (lockEntry.getClientId().equals(clientId)) { if (lockEntry.getClientId().equals(clientId)) {
groupValue.remove(mq); groupValue.remove(mq);
log.info("unlockBatch, Group: {} {} {}", log.info("unlockBatch, Group: {} {} {}",
group, group,
mq, mq,
clientId); clientId);
} else { } else {
log.warn("unlockBatch, but mq locked by other client: {}, Group: {} {} {}", log.warn("unlockBatch, but mq locked by other client: {}, Group: {} {} {}",
lockEntry.getClientId(), lockEntry.getClientId(),
group,
mq,
clientId);
}
} else {
log.warn("unlockBatch, but mq not locked, Group: {} {} {}",
group, group,
mq, mq,
clientId); clientId);
}
} else {
log.warn("unlockBatch, but mq not locked, Group: {} {} {}",
group,
mq,
clientId);
} }
} }
} else { } else {
log.warn("unlockBatch, group not exist, Group: {} {}", log.warn("unlockBatch, group not exist, Group: {} {}",
group, group,
clientId); clientId);
} }
} finally { } finally {
this.lock.unlock(); this.lock.unlock();
...@@ -243,22 +234,18 @@ public class RebalanceLockManager { ...@@ -243,22 +234,18 @@ public class RebalanceLockManager {
private String clientId; private String clientId;
private volatile long lastUpdateTimestamp = System.currentTimeMillis(); private volatile long lastUpdateTimestamp = System.currentTimeMillis();
public String getClientId() { public String getClientId() {
return clientId; return clientId;
} }
public void setClientId(String clientId) { public void setClientId(String clientId) {
this.clientId = clientId; this.clientId = clientId;
} }
public long getLastUpdateTimestamp() { public long getLastUpdateTimestamp() {
return lastUpdateTimestamp; return lastUpdateTimestamp;
} }
public void setLastUpdateTimestamp(long lastUpdateTimestamp) { public void setLastUpdateTimestamp(long lastUpdateTimestamp) {
this.lastUpdateTimestamp = lastUpdateTimestamp; this.lastUpdateTimestamp = lastUpdateTimestamp;
} }
...@@ -270,7 +257,7 @@ public class RebalanceLockManager { ...@@ -270,7 +257,7 @@ public class RebalanceLockManager {
public boolean isExpired() { public boolean isExpired() {
boolean expired = boolean expired =
(System.currentTimeMillis() - this.lastUpdateTimestamp) > REBALANCE_LOCK_MAX_LIVE_TIME; (System.currentTimeMillis() - this.lastUpdateTimestamp) > REBALANCE_LOCK_MAX_LIVE_TIME;
return expired; return expired;
} }
......
...@@ -17,15 +17,7 @@ ...@@ -17,15 +17,7 @@
package org.apache.rocketmq.broker.filtersrv; package org.apache.rocketmq.broker.filtersrv;
import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.BrokerStartup;
import org.apache.rocketmq.common.ThreadFactoryImpl;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.common.RemotingUtil;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
...@@ -34,18 +26,24 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -34,18 +26,24 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.BrokerStartup;
import org.apache.rocketmq.common.ThreadFactoryImpl;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.common.RemotingUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FilterServerManager { public class FilterServerManager {
public static final long FILTER_SERVER_MAX_IDLE_TIME_MILLS = 30000; public static final long FILTER_SERVER_MAX_IDLE_TIME_MILLS = 30000;
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final ConcurrentHashMap<Channel, FilterServerInfo> filterServerTable = private final ConcurrentHashMap<Channel, FilterServerInfo> filterServerTable =
new ConcurrentHashMap<Channel, FilterServerInfo>(16); new ConcurrentHashMap<Channel, FilterServerInfo>(16);
private final BrokerController brokerController; private final BrokerController brokerController;
private ScheduledExecutorService scheduledExecutorService = Executors private ScheduledExecutorService scheduledExecutorService = Executors
.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("FilterServerManagerScheduledThread")); .newSingleThreadScheduledExecutor(new ThreadFactoryImpl("FilterServerManagerScheduledThread"));
public FilterServerManager(final BrokerController brokerController) { public FilterServerManager(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
...@@ -67,7 +65,7 @@ public class FilterServerManager { ...@@ -67,7 +65,7 @@ public class FilterServerManager {
public void createFilterServer() { public void createFilterServer() {
int more = int more =
this.brokerController.getBrokerConfig().getFilterServerNums() - this.filterServerTable.size(); this.brokerController.getBrokerConfig().getFilterServerNums() - this.filterServerTable.size();
String cmd = this.buildStartCommand(); String cmd = this.buildStartCommand();
for (int i = 0; i < more; i++) { for (int i = 0; i < more; i++) {
FilterServerUtil.callShell(cmd, log); FilterServerUtil.callShell(cmd, log);
...@@ -86,12 +84,12 @@ public class FilterServerManager { ...@@ -86,12 +84,12 @@ public class FilterServerManager {
if (RemotingUtil.isWindowsPlatform()) { if (RemotingUtil.isWindowsPlatform()) {
return String.format("start /b %s\\bin\\mqfiltersrv.exe %s", return String.format("start /b %s\\bin\\mqfiltersrv.exe %s",
this.brokerController.getBrokerConfig().getRocketmqHome(), this.brokerController.getBrokerConfig().getRocketmqHome(),
config); config);
} else { } else {
return String.format("sh %s/bin/startfsrv.sh %s", return String.format("sh %s/bin/startfsrv.sh %s",
this.brokerController.getBrokerConfig().getRocketmqHome(), this.brokerController.getBrokerConfig().getRocketmqHome(),
config); config);
} }
} }
...@@ -134,7 +132,7 @@ public class FilterServerManager { ...@@ -134,7 +132,7 @@ public class FilterServerManager {
FilterServerInfo old = this.filterServerTable.remove(channel); FilterServerInfo old = this.filterServerTable.remove(channel);
if (old != null) { if (old != null) {
log.warn("The Filter Server<{}> connection<{}> closed, remove it", old.getFilterServerAddr(), log.warn("The Filter Server<{}> connection<{}> closed, remove it", old.getFilterServerAddr(),
remoteAddr); remoteAddr);
} }
} }
...@@ -152,22 +150,18 @@ public class FilterServerManager { ...@@ -152,22 +150,18 @@ public class FilterServerManager {
private String filterServerAddr; private String filterServerAddr;
private long lastUpdateTimestamp; private long lastUpdateTimestamp;
public String getFilterServerAddr() { public String getFilterServerAddr() {
return filterServerAddr; return filterServerAddr;
} }
public void setFilterServerAddr(String filterServerAddr) { public void setFilterServerAddr(String filterServerAddr) {
this.filterServerAddr = filterServerAddr; this.filterServerAddr = filterServerAddr;
} }
public long getLastUpdateTimestamp() { public long getLastUpdateTimestamp() {
return lastUpdateTimestamp; return lastUpdateTimestamp;
} }
public void setLastUpdateTimestamp(long lastUpdateTimestamp) { public void setLastUpdateTimestamp(long lastUpdateTimestamp) {
this.lastUpdateTimestamp = lastUpdateTimestamp; this.lastUpdateTimestamp = lastUpdateTimestamp;
} }
......
...@@ -6,20 +6,19 @@ ...@@ -6,20 +6,19 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.filtersrv; package org.apache.rocketmq.broker.filtersrv;
import org.slf4j.Logger; import org.slf4j.Logger;
public class FilterServerUtil { public class FilterServerUtil {
public static void callShell(final String shellString, final Logger log) { public static void callShell(final String shellString, final Logger log) {
Process process = null; Process process = null;
......
...@@ -6,16 +6,19 @@ ...@@ -6,16 +6,19 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.latency; package org.apache.rocketmq.broker.latency;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.common.ThreadFactoryImpl; import org.apache.rocketmq.common.ThreadFactoryImpl;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
...@@ -24,21 +27,27 @@ import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode; ...@@ -24,21 +27,27 @@ import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class BrokerFastFailure { public class BrokerFastFailure {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl( private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(
"BrokerFastFailureScheduledThread")); "BrokerFastFailureScheduledThread"));
private final BrokerController brokerController; private final BrokerController brokerController;
public BrokerFastFailure(final BrokerController brokerController) { public BrokerFastFailure(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
public static RequestTask castRunnable(final Runnable runnable) {
try {
FutureTaskExt object = (FutureTaskExt)runnable;
return (RequestTask)object.getRunnable();
} catch (Throwable e) {
log.error(String.format("castRunnable exception, %s", runnable.getClass().getName()), e);
}
return null;
}
public void start() { public void start() {
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override @Override
...@@ -95,17 +104,6 @@ public class BrokerFastFailure { ...@@ -95,17 +104,6 @@ public class BrokerFastFailure {
} }
} }
public static RequestTask castRunnable(final Runnable runnable) {
try {
FutureTaskExt object = (FutureTaskExt) runnable;
return (RequestTask) object.getRunnable();
} catch (Throwable e) {
log.error(String.format("castRunnable exception, %s", runnable.getClass().getName()), e);
}
return null;
}
public void shutdown() { public void shutdown() {
this.scheduledExecutorService.shutdown(); this.scheduledExecutorService.shutdown();
} }
......
...@@ -17,22 +17,31 @@ ...@@ -17,22 +17,31 @@
package org.apache.rocketmq.broker.latency; package org.apache.rocketmq.broker.latency;
import java.util.concurrent.*; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class BrokerFixedThreadPoolExecutor extends ThreadPoolExecutor { public class BrokerFixedThreadPoolExecutor extends ThreadPoolExecutor {
public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue) { public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit,
final BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
} }
public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory) { public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit,
final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
} }
public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue, final RejectedExecutionHandler handler) { public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit,
final BlockingQueue<Runnable> workQueue, final RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
} }
public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory, final RejectedExecutionHandler handler) { public BrokerFixedThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit,
final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory, final RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
} }
......
...@@ -6,37 +6,33 @@ ...@@ -6,37 +6,33 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.longpolling; package org.apache.rocketmq.broker.longpolling;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ManyPullRequest { public class ManyPullRequest {
private final ArrayList<PullRequest> pullRequestList = new ArrayList<PullRequest>(); private final ArrayList<PullRequest> pullRequestList = new ArrayList<PullRequest>();
public synchronized void addPullRequest(final PullRequest pullRequest) { public synchronized void addPullRequest(final PullRequest pullRequest) {
this.pullRequestList.add(pullRequest); this.pullRequestList.add(pullRequest);
} }
public synchronized void addPullRequest(final List<PullRequest> many) { public synchronized void addPullRequest(final List<PullRequest> many) {
this.pullRequestList.addAll(many); this.pullRequestList.addAll(many);
} }
public synchronized List<PullRequest> cloneListAndClear() { public synchronized List<PullRequest> cloneListAndClear() {
if (!this.pullRequestList.isEmpty()) { if (!this.pullRequestList.isEmpty()) {
List<PullRequest> result = (ArrayList<PullRequest>) this.pullRequestList.clone(); List<PullRequest> result = (ArrayList<PullRequest>)this.pullRequestList.clone();
this.pullRequestList.clear(); this.pullRequestList.clear();
return result; return result;
} }
......
...@@ -6,29 +6,26 @@ ...@@ -6,29 +6,26 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.longpolling; package org.apache.rocketmq.broker.longpolling;
import org.apache.rocketmq.store.MessageArrivingListener; import org.apache.rocketmq.store.MessageArrivingListener;
public class NotifyMessageArrivingListener implements MessageArrivingListener { public class NotifyMessageArrivingListener implements MessageArrivingListener {
private final PullRequestHoldService pullRequestHoldService; private final PullRequestHoldService pullRequestHoldService;
public NotifyMessageArrivingListener(final PullRequestHoldService pullRequestHoldService) { public NotifyMessageArrivingListener(final PullRequestHoldService pullRequestHoldService) {
this.pullRequestHoldService = pullRequestHoldService; this.pullRequestHoldService = pullRequestHoldService;
} }
@Override @Override
public void arriving(String topic, int queueId, long logicOffset, long tagsCode) { public void arriving(String topic, int queueId, long logicOffset, long tagsCode) {
this.pullRequestHoldService.notifyMessageArriving(topic, queueId, logicOffset, tagsCode); this.pullRequestHoldService.notifyMessageArriving(topic, queueId, logicOffset, tagsCode);
......
...@@ -6,20 +6,19 @@ ...@@ -6,20 +6,19 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.longpolling; package org.apache.rocketmq.broker.longpolling;
import io.netty.channel.Channel;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import io.netty.channel.Channel;
public class PullRequest { public class PullRequest {
private final RemotingCommand requestCommand; private final RemotingCommand requestCommand;
...@@ -29,9 +28,8 @@ public class PullRequest { ...@@ -29,9 +28,8 @@ public class PullRequest {
private final long pullFromThisOffset; private final long pullFromThisOffset;
private final SubscriptionData subscriptionData; private final SubscriptionData subscriptionData;
public PullRequest(RemotingCommand requestCommand, Channel clientChannel, long timeoutMillis, long suspendTimestamp, public PullRequest(RemotingCommand requestCommand, Channel clientChannel, long timeoutMillis, long suspendTimestamp,
long pullFromThisOffset, SubscriptionData subscriptionData) { long pullFromThisOffset, SubscriptionData subscriptionData) {
this.requestCommand = requestCommand; this.requestCommand = requestCommand;
this.clientChannel = clientChannel; this.clientChannel = clientChannel;
this.timeoutMillis = timeoutMillis; this.timeoutMillis = timeoutMillis;
...@@ -40,27 +38,22 @@ public class PullRequest { ...@@ -40,27 +38,22 @@ public class PullRequest {
this.subscriptionData = subscriptionData; this.subscriptionData = subscriptionData;
} }
public RemotingCommand getRequestCommand() { public RemotingCommand getRequestCommand() {
return requestCommand; return requestCommand;
} }
public Channel getClientChannel() { public Channel getClientChannel() {
return clientChannel; return clientChannel;
} }
public long getTimeoutMillis() { public long getTimeoutMillis() {
return timeoutMillis; return timeoutMillis;
} }
public long getSuspendTimestamp() { public long getSuspendTimestamp() {
return suspendTimestamp; return suspendTimestamp;
} }
public long getPullFromThisOffset() { public long getPullFromThisOffset() {
return pullFromThisOffset; return pullFromThisOffset;
} }
......
...@@ -16,6 +16,9 @@ ...@@ -16,6 +16,9 @@
*/ */
package org.apache.rocketmq.broker.longpolling; package org.apache.rocketmq.broker.longpolling;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.common.ServiceThread; import org.apache.rocketmq.common.ServiceThread;
import org.apache.rocketmq.common.SystemClock; import org.apache.rocketmq.common.SystemClock;
...@@ -25,11 +28,6 @@ import org.apache.rocketmq.store.MessageFilter; ...@@ -25,11 +28,6 @@ import org.apache.rocketmq.store.MessageFilter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
public class PullRequestHoldService extends ServiceThread { public class PullRequestHoldService extends ServiceThread {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private static final String TOPIC_QUEUEID_SEPARATOR = "@"; private static final String TOPIC_QUEUEID_SEPARATOR = "@";
...@@ -37,8 +35,7 @@ public class PullRequestHoldService extends ServiceThread { ...@@ -37,8 +35,7 @@ public class PullRequestHoldService extends ServiceThread {
private final SystemClock systemClock = new SystemClock(); private final SystemClock systemClock = new SystemClock();
private final MessageFilter messageFilter = new DefaultMessageFilter(); private final MessageFilter messageFilter = new DefaultMessageFilter();
private ConcurrentHashMap<String/* topic@queueId */, ManyPullRequest> pullRequestTable = private ConcurrentHashMap<String/* topic@queueId */, ManyPullRequest> pullRequestTable =
new ConcurrentHashMap<String, ManyPullRequest>(1024); new ConcurrentHashMap<String, ManyPullRequest>(1024);
public PullRequestHoldService(final BrokerController brokerController) { public PullRequestHoldService(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
...@@ -135,7 +132,7 @@ public class PullRequestHoldService extends ServiceThread { ...@@ -135,7 +132,7 @@ public class PullRequestHoldService extends ServiceThread {
if (this.messageFilter.isMessageMatched(request.getSubscriptionData(), tmp)) { if (this.messageFilter.isMessageMatched(request.getSubscriptionData(), tmp)) {
try { try {
this.brokerController.getPullMessageProcessor().excuteRequestWhenWakeup(request.getClientChannel(), this.brokerController.getPullMessageProcessor().excuteRequestWhenWakeup(request.getClientChannel(),
request.getRequestCommand()); request.getRequestCommand());
} catch (Throwable e) { } catch (Throwable e) {
log.error("execute request when wakeup failed.", e); log.error("execute request when wakeup failed.", e);
} }
...@@ -146,14 +143,13 @@ public class PullRequestHoldService extends ServiceThread { ...@@ -146,14 +143,13 @@ public class PullRequestHoldService extends ServiceThread {
if (System.currentTimeMillis() >= (request.getSuspendTimestamp() + request.getTimeoutMillis())) { if (System.currentTimeMillis() >= (request.getSuspendTimestamp() + request.getTimeoutMillis())) {
try { try {
this.brokerController.getPullMessageProcessor().excuteRequestWhenWakeup(request.getClientChannel(), this.brokerController.getPullMessageProcessor().excuteRequestWhenWakeup(request.getClientChannel(),
request.getRequestCommand()); request.getRequestCommand());
} catch (Throwable e) { } catch (Throwable e) {
log.error("execute request when wakeup failed.", e); log.error("execute request when wakeup failed.", e);
} }
continue; continue;
} }
replayList.add(request); replayList.add(request);
} }
......
...@@ -6,20 +6,18 @@ ...@@ -6,20 +6,18 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.mqtrace; package org.apache.rocketmq.broker.mqtrace;
import org.apache.rocketmq.store.stats.BrokerStatsManager;
import java.util.Map; import java.util.Map;
import org.apache.rocketmq.store.stats.BrokerStatsManager;
public class ConsumeMessageContext { public class ConsumeMessageContext {
private String consumerGroup; private String consumerGroup;
...@@ -38,102 +36,82 @@ public class ConsumeMessageContext { ...@@ -38,102 +36,82 @@ public class ConsumeMessageContext {
private int commercialRcvTimes; private int commercialRcvTimes;
private int commercialRcvSize; private int commercialRcvSize;
public String getConsumerGroup() { public String getConsumerGroup() {
return consumerGroup; return consumerGroup;
} }
public void setConsumerGroup(String consumerGroup) { public void setConsumerGroup(String consumerGroup) {
this.consumerGroup = consumerGroup; this.consumerGroup = consumerGroup;
} }
public String getTopic() { public String getTopic() {
return topic; return topic;
} }
public void setTopic(String topic) { public void setTopic(String topic) {
this.topic = topic; this.topic = topic;
} }
public Integer getQueueId() { public Integer getQueueId() {
return queueId; return queueId;
} }
public void setQueueId(Integer queueId) { public void setQueueId(Integer queueId) {
this.queueId = queueId; this.queueId = queueId;
} }
public String getClientHost() { public String getClientHost() {
return clientHost; return clientHost;
} }
public void setClientHost(String clientHost) { public void setClientHost(String clientHost) {
this.clientHost = clientHost; this.clientHost = clientHost;
} }
public String getStoreHost() { public String getStoreHost() {
return storeHost; return storeHost;
} }
public void setStoreHost(String storeHost) { public void setStoreHost(String storeHost) {
this.storeHost = storeHost; this.storeHost = storeHost;
} }
public Map<String, Long> getMessageIds() { public Map<String, Long> getMessageIds() {
return messageIds; return messageIds;
} }
public void setMessageIds(Map<String, Long> messageIds) { public void setMessageIds(Map<String, Long> messageIds) {
this.messageIds = messageIds; this.messageIds = messageIds;
} }
public boolean isSuccess() { public boolean isSuccess() {
return success; return success;
} }
public void setSuccess(boolean success) { public void setSuccess(boolean success) {
this.success = success; this.success = success;
} }
public String getStatus() { public String getStatus() {
return status; return status;
} }
public void setStatus(String status) { public void setStatus(String status) {
this.status = status; this.status = status;
} }
public Object getMqTraceContext() { public Object getMqTraceContext() {
return mqTraceContext; return mqTraceContext;
} }
public void setMqTraceContext(Object mqTraceContext) { public void setMqTraceContext(Object mqTraceContext) {
this.mqTraceContext = mqTraceContext; this.mqTraceContext = mqTraceContext;
} }
public int getBodyLength() { public int getBodyLength() {
return bodyLength; return bodyLength;
} }
public void setBodyLength(int bodyLength) { public void setBodyLength(int bodyLength) {
this.bodyLength = bodyLength; this.bodyLength = bodyLength;
} }
......
...@@ -6,22 +6,20 @@ ...@@ -6,22 +6,20 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.mqtrace; package org.apache.rocketmq.broker.mqtrace;
public interface ConsumeMessageHook { public interface ConsumeMessageHook {
String hookName(); String hookName();
void consumeMessageBefore(final ConsumeMessageContext context); void consumeMessageBefore(final ConsumeMessageContext context);
void consumeMessageAfter(final ConsumeMessageContext context); void consumeMessageAfter(final ConsumeMessageContext context);
} }
...@@ -6,22 +6,20 @@ ...@@ -6,22 +6,20 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.mqtrace; package org.apache.rocketmq.broker.mqtrace;
import java.util.Properties;
import org.apache.rocketmq.common.message.MessageType; import org.apache.rocketmq.common.message.MessageType;
import org.apache.rocketmq.store.stats.BrokerStatsManager; import org.apache.rocketmq.store.stats.BrokerStatsManager;
import java.util.Properties;
public class SendMessageContext { public class SendMessageContext {
private String producerGroup; private String producerGroup;
private String topic; private String topic;
...@@ -92,137 +90,110 @@ public class SendMessageContext { ...@@ -92,137 +90,110 @@ public class SendMessageContext {
return producerGroup; return producerGroup;
} }
public void setProducerGroup(String producerGroup) { public void setProducerGroup(String producerGroup) {
this.producerGroup = producerGroup; this.producerGroup = producerGroup;
} }
public String getTopic() { public String getTopic() {
return topic; return topic;
} }
public void setTopic(String topic) { public void setTopic(String topic) {
this.topic = topic; this.topic = topic;
} }
public String getMsgId() { public String getMsgId() {
return msgId; return msgId;
} }
public void setMsgId(String msgId) { public void setMsgId(String msgId) {
this.msgId = msgId; this.msgId = msgId;
} }
public String getOriginMsgId() { public String getOriginMsgId() {
return originMsgId; return originMsgId;
} }
public void setOriginMsgId(String originMsgId) { public void setOriginMsgId(String originMsgId) {
this.originMsgId = originMsgId; this.originMsgId = originMsgId;
} }
public Integer getQueueId() { public Integer getQueueId() {
return queueId; return queueId;
} }
public void setQueueId(Integer queueId) { public void setQueueId(Integer queueId) {
this.queueId = queueId; this.queueId = queueId;
} }
public Long getQueueOffset() { public Long getQueueOffset() {
return queueOffset; return queueOffset;
} }
public void setQueueOffset(Long queueOffset) { public void setQueueOffset(Long queueOffset) {
this.queueOffset = queueOffset; this.queueOffset = queueOffset;
} }
public String getBrokerAddr() { public String getBrokerAddr() {
return brokerAddr; return brokerAddr;
} }
public void setBrokerAddr(String brokerAddr) { public void setBrokerAddr(String brokerAddr) {
this.brokerAddr = brokerAddr; this.brokerAddr = brokerAddr;
} }
public String getBornHost() { public String getBornHost() {
return bornHost; return bornHost;
} }
public void setBornHost(String bornHost) { public void setBornHost(String bornHost) {
this.bornHost = bornHost; this.bornHost = bornHost;
} }
public int getBodyLength() { public int getBodyLength() {
return bodyLength; return bodyLength;
} }
public void setBodyLength(int bodyLength) { public void setBodyLength(int bodyLength) {
this.bodyLength = bodyLength; this.bodyLength = bodyLength;
} }
public int getCode() { public int getCode() {
return code; return code;
} }
public void setCode(int code) { public void setCode(int code) {
this.code = code; this.code = code;
} }
public String getErrorMsg() { public String getErrorMsg() {
return errorMsg; return errorMsg;
} }
public void setErrorMsg(String errorMsg) { public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg; this.errorMsg = errorMsg;
} }
public String getMsgProps() { public String getMsgProps() {
return msgProps; return msgProps;
} }
public void setMsgProps(String msgProps) { public void setMsgProps(String msgProps) {
this.msgProps = msgProps; this.msgProps = msgProps;
} }
public Object getMqTraceContext() { public Object getMqTraceContext() {
return mqTraceContext; return mqTraceContext;
} }
public void setMqTraceContext(Object mqTraceContext) { public void setMqTraceContext(Object mqTraceContext) {
this.mqTraceContext = mqTraceContext; this.mqTraceContext = mqTraceContext;
} }
public Properties getExtProps() { public Properties getExtProps() {
return extProps; return extProps;
} }
public void setExtProps(Properties extProps) { public void setExtProps(Properties extProps) {
this.extProps = extProps; this.extProps = extProps;
} }
......
...@@ -6,22 +6,20 @@ ...@@ -6,22 +6,20 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.mqtrace; package org.apache.rocketmq.broker.mqtrace;
public interface SendMessageHook { public interface SendMessageHook {
public String hookName(); public String hookName();
public void sendMessageBefore(final SendMessageContext context); public void sendMessageBefore(final SendMessageContext context);
public void sendMessageAfter(final SendMessageContext context); public void sendMessageAfter(final SendMessageContext context);
} }
...@@ -6,16 +6,23 @@ ...@@ -6,16 +6,23 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.offset; package org.apache.rocketmq.broker.offset;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.BrokerPathConfigHelper; import org.apache.rocketmq.broker.BrokerPathConfigHelper;
import org.apache.rocketmq.common.ConfigManager; import org.apache.rocketmq.common.ConfigManager;
...@@ -25,30 +32,22 @@ import org.apache.rocketmq.remoting.protocol.RemotingSerializable; ...@@ -25,30 +32,22 @@ import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
public class ConsumerOffsetManager extends ConfigManager { public class ConsumerOffsetManager extends ConfigManager {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private static final String TOPIC_GROUP_SEPARATOR = "@"; private static final String TOPIC_GROUP_SEPARATOR = "@";
private ConcurrentHashMap<String/* topic@group */, ConcurrentHashMap<Integer, Long>> offsetTable = private ConcurrentHashMap<String/* topic@group */, ConcurrentHashMap<Integer, Long>> offsetTable =
new ConcurrentHashMap<String, ConcurrentHashMap<Integer, Long>>(512); new ConcurrentHashMap<String, ConcurrentHashMap<Integer, Long>>(512);
private transient BrokerController brokerController; private transient BrokerController brokerController;
public ConsumerOffsetManager() { public ConsumerOffsetManager() {
} }
public ConsumerOffsetManager(BrokerController brokerController) { public ConsumerOffsetManager(BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
public void scanUnsubscribedTopic() { public void scanUnsubscribedTopic() {
Iterator<Entry<String, ConcurrentHashMap<Integer, Long>>> it = this.offsetTable.entrySet().iterator(); Iterator<Entry<String, ConcurrentHashMap<Integer, Long>>> it = this.offsetTable.entrySet().iterator();
while (it.hasNext()) { while (it.hasNext()) {
...@@ -60,7 +59,7 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -60,7 +59,7 @@ public class ConsumerOffsetManager extends ConfigManager {
String group = arrays[1]; String group = arrays[1];
if (null == brokerController.getConsumerManager().findSubscriptionData(group, topic) if (null == brokerController.getConsumerManager().findSubscriptionData(group, topic)
&& this.offsetBehindMuchThanData(topic, next.getValue())) { && this.offsetBehindMuchThanData(topic, next.getValue())) {
it.remove(); it.remove();
log.warn("remove topic offset, {}", topicAtGroup); log.warn("remove topic offset, {}", topicAtGroup);
} }
...@@ -68,7 +67,6 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -68,7 +67,6 @@ public class ConsumerOffsetManager extends ConfigManager {
} }
} }
private boolean offsetBehindMuchThanData(final String topic, ConcurrentHashMap<Integer, Long> table) { private boolean offsetBehindMuchThanData(final String topic, ConcurrentHashMap<Integer, Long> table) {
Iterator<Entry<Integer, Long>> it = table.entrySet().iterator(); Iterator<Entry<Integer, Long>> it = table.entrySet().iterator();
boolean result = !table.isEmpty(); boolean result = !table.isEmpty();
...@@ -83,7 +81,6 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -83,7 +81,6 @@ public class ConsumerOffsetManager extends ConfigManager {
return result; return result;
} }
public Set<String> whichTopicByConsumer(final String group) { public Set<String> whichTopicByConsumer(final String group) {
Set<String> topics = new HashSet<String>(); Set<String> topics = new HashSet<String>();
...@@ -102,7 +99,6 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -102,7 +99,6 @@ public class ConsumerOffsetManager extends ConfigManager {
return topics; return topics;
} }
public Set<String> whichGroupByTopic(final String topic) { public Set<String> whichGroupByTopic(final String topic) {
Set<String> groups = new HashSet<String>(); Set<String> groups = new HashSet<String>();
...@@ -121,7 +117,6 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -121,7 +117,6 @@ public class ConsumerOffsetManager extends ConfigManager {
return groups; return groups;
} }
public void commitOffset(final String clientHost, final String group, final String topic, final int queueId, final long offset) { public void commitOffset(final String clientHost, final String group, final String topic, final int queueId, final long offset) {
// topic@group // topic@group
String key = topic + TOPIC_GROUP_SEPARATOR + group; String key = topic + TOPIC_GROUP_SEPARATOR + group;
...@@ -182,12 +177,10 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -182,12 +177,10 @@ public class ConsumerOffsetManager extends ConfigManager {
return offsetTable; return offsetTable;
} }
public void setOffsetTable(ConcurrentHashMap<String, ConcurrentHashMap<Integer, Long>> offsetTable) { public void setOffsetTable(ConcurrentHashMap<String, ConcurrentHashMap<Integer, Long>> offsetTable) {
this.offsetTable = offsetTable; this.offsetTable = offsetTable;
} }
public Map<Integer, Long> queryMinOffsetInAllGroup(final String topic, final String filterGroups) { public Map<Integer, Long> queryMinOffsetInAllGroup(final String topic, final String filterGroups) {
Map<Integer, Long> queueMinOffset = new HashMap<Integer, Long>(); Map<Integer, Long> queueMinOffset = new HashMap<Integer, Long>();
...@@ -224,14 +217,12 @@ public class ConsumerOffsetManager extends ConfigManager { ...@@ -224,14 +217,12 @@ public class ConsumerOffsetManager extends ConfigManager {
return queueMinOffset; return queueMinOffset;
} }
public Map<Integer, Long> queryOffset(final String group, final String topic) { public Map<Integer, Long> queryOffset(final String group, final String topic) {
// topic@group // topic@group
String key = topic + TOPIC_GROUP_SEPARATOR + group; String key = topic + TOPIC_GROUP_SEPARATOR + group;
return this.offsetTable.get(key); return this.offsetTable.get(key);
} }
public void cloneOffset(final String srcGroup, final String destGroup, final String topic) { public void cloneOffset(final String srcGroup, final String destGroup, final String topic) {
ConcurrentHashMap<Integer, Long> offsets = this.offsetTable.get(topic + TOPIC_GROUP_SEPARATOR + srcGroup); ConcurrentHashMap<Integer, Long> offsets = this.offsetTable.get(topic + TOPIC_GROUP_SEPARATOR + srcGroup);
if (offsets != null) { if (offsets != null) {
......
...@@ -16,6 +16,9 @@ ...@@ -16,6 +16,9 @@
*/ */
package org.apache.rocketmq.broker.out; package org.apache.rocketmq.broker.out;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.MixAll;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
...@@ -23,24 +26,27 @@ import org.apache.rocketmq.common.namesrv.RegisterBrokerResult; ...@@ -23,24 +26,27 @@ import org.apache.rocketmq.common.namesrv.RegisterBrokerResult;
import org.apache.rocketmq.common.namesrv.TopAddressing; import org.apache.rocketmq.common.namesrv.TopAddressing;
import org.apache.rocketmq.common.protocol.RequestCode; import org.apache.rocketmq.common.protocol.RequestCode;
import org.apache.rocketmq.common.protocol.ResponseCode; import org.apache.rocketmq.common.protocol.ResponseCode;
import org.apache.rocketmq.common.protocol.body.*; import org.apache.rocketmq.common.protocol.body.ConsumerOffsetSerializeWrapper;
import org.apache.rocketmq.common.protocol.body.KVTable;
import org.apache.rocketmq.common.protocol.body.RegisterBrokerBody;
import org.apache.rocketmq.common.protocol.body.SubscriptionGroupWrapper;
import org.apache.rocketmq.common.protocol.body.TopicConfigSerializeWrapper;
import org.apache.rocketmq.common.protocol.header.namesrv.RegisterBrokerRequestHeader; import org.apache.rocketmq.common.protocol.header.namesrv.RegisterBrokerRequestHeader;
import org.apache.rocketmq.common.protocol.header.namesrv.RegisterBrokerResponseHeader; import org.apache.rocketmq.common.protocol.header.namesrv.RegisterBrokerResponseHeader;
import org.apache.rocketmq.common.protocol.header.namesrv.UnRegisterBrokerRequestHeader; import org.apache.rocketmq.common.protocol.header.namesrv.UnRegisterBrokerRequestHeader;
import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.RemotingClient; import org.apache.rocketmq.remoting.RemotingClient;
import org.apache.rocketmq.remoting.exception.*; import org.apache.rocketmq.remoting.exception.RemotingCommandException;
import org.apache.rocketmq.remoting.exception.RemotingConnectException;
import org.apache.rocketmq.remoting.exception.RemotingSendRequestException;
import org.apache.rocketmq.remoting.exception.RemotingTimeoutException;
import org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException;
import org.apache.rocketmq.remoting.netty.NettyClientConfig; import org.apache.rocketmq.remoting.netty.NettyClientConfig;
import org.apache.rocketmq.remoting.netty.NettyRemotingClient; import org.apache.rocketmq.remoting.netty.NettyRemotingClient;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class BrokerOuterAPI { public class BrokerOuterAPI {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final RemotingClient remotingClient; private final RemotingClient remotingClient;
...@@ -92,15 +98,15 @@ public class BrokerOuterAPI { ...@@ -92,15 +98,15 @@ public class BrokerOuterAPI {
} }
public RegisterBrokerResult registerBrokerAll( public RegisterBrokerResult registerBrokerAll(
final String clusterName, final String clusterName,
final String brokerAddr, final String brokerAddr,
final String brokerName, final String brokerName,
final long brokerId, final long brokerId,
final String haServerAddr, final String haServerAddr,
final TopicConfigSerializeWrapper topicConfigWrapper, final TopicConfigSerializeWrapper topicConfigWrapper,
final List<String> filterServerList, final List<String> filterServerList,
final boolean oneway, final boolean oneway,
final int timeoutMills) { final int timeoutMills) {
RegisterBrokerResult registerBrokerResult = null; RegisterBrokerResult registerBrokerResult = null;
List<String> nameServerAddressList = this.remotingClient.getNameServerAddressList(); List<String> nameServerAddressList = this.remotingClient.getNameServerAddressList();
...@@ -108,7 +114,7 @@ public class BrokerOuterAPI { ...@@ -108,7 +114,7 @@ public class BrokerOuterAPI {
for (String namesrvAddr : nameServerAddressList) { for (String namesrvAddr : nameServerAddressList) {
try { try {
RegisterBrokerResult result = this.registerBroker(namesrvAddr, clusterName, brokerAddr, brokerName, brokerId, RegisterBrokerResult result = this.registerBroker(namesrvAddr, clusterName, brokerAddr, brokerName, brokerId,
haServerAddr, topicConfigWrapper, filterServerList, oneway, timeoutMills); haServerAddr, topicConfigWrapper, filterServerList, oneway, timeoutMills);
if (result != null) { if (result != null) {
registerBrokerResult = result; registerBrokerResult = result;
} }
...@@ -124,18 +130,18 @@ public class BrokerOuterAPI { ...@@ -124,18 +130,18 @@ public class BrokerOuterAPI {
} }
private RegisterBrokerResult registerBroker( private RegisterBrokerResult registerBroker(
final String namesrvAddr, final String namesrvAddr,
final String clusterName, final String clusterName,
final String brokerAddr, final String brokerAddr,
final String brokerName, final String brokerName,
final long brokerId, final long brokerId,
final String haServerAddr, final String haServerAddr,
final TopicConfigSerializeWrapper topicConfigWrapper, final TopicConfigSerializeWrapper topicConfigWrapper,
final List<String> filterServerList, final List<String> filterServerList,
final boolean oneway, final boolean oneway,
final int timeoutMills final int timeoutMills
) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, ) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException,
InterruptedException { InterruptedException {
RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader(); RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader();
requestHeader.setBrokerAddr(brokerAddr); requestHeader.setBrokerAddr(brokerAddr);
requestHeader.setBrokerId(brokerId); requestHeader.setBrokerId(brokerId);
...@@ -163,7 +169,7 @@ public class BrokerOuterAPI { ...@@ -163,7 +169,7 @@ public class BrokerOuterAPI {
switch (response.getCode()) { switch (response.getCode()) {
case ResponseCode.SUCCESS: { case ResponseCode.SUCCESS: {
RegisterBrokerResponseHeader responseHeader = RegisterBrokerResponseHeader responseHeader =
(RegisterBrokerResponseHeader) response.decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); (RegisterBrokerResponseHeader)response.decodeCommandCustomHeader(RegisterBrokerResponseHeader.class);
RegisterBrokerResult result = new RegisterBrokerResult(); RegisterBrokerResult result = new RegisterBrokerResult();
result.setMasterAddr(responseHeader.getMasterAddr()); result.setMasterAddr(responseHeader.getMasterAddr());
result.setHaServerAddr(responseHeader.getHaServerAddr()); result.setHaServerAddr(responseHeader.getHaServerAddr());
...@@ -181,10 +187,10 @@ public class BrokerOuterAPI { ...@@ -181,10 +187,10 @@ public class BrokerOuterAPI {
} }
public void unregisterBrokerAll( public void unregisterBrokerAll(
final String clusterName, final String clusterName,
final String brokerAddr, final String brokerAddr,
final String brokerName, final String brokerName,
final long brokerId final long brokerId
) { ) {
List<String> nameServerAddressList = this.remotingClient.getNameServerAddressList(); List<String> nameServerAddressList = this.remotingClient.getNameServerAddressList();
if (nameServerAddressList != null) { if (nameServerAddressList != null) {
...@@ -200,11 +206,11 @@ public class BrokerOuterAPI { ...@@ -200,11 +206,11 @@ public class BrokerOuterAPI {
} }
public void unregisterBroker( public void unregisterBroker(
final String namesrvAddr, final String namesrvAddr,
final String clusterName, final String clusterName,
final String brokerAddr, final String brokerAddr,
final String brokerName, final String brokerName,
final long brokerId final long brokerId
) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException, MQBrokerException { ) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException, MQBrokerException {
UnRegisterBrokerRequestHeader requestHeader = new UnRegisterBrokerRequestHeader(); UnRegisterBrokerRequestHeader requestHeader = new UnRegisterBrokerRequestHeader();
requestHeader.setBrokerAddr(brokerAddr); requestHeader.setBrokerAddr(brokerAddr);
...@@ -227,7 +233,7 @@ public class BrokerOuterAPI { ...@@ -227,7 +233,7 @@ public class BrokerOuterAPI {
} }
public TopicConfigSerializeWrapper getAllTopicConfig(final String addr) throws RemotingConnectException, RemotingSendRequestException, public TopicConfigSerializeWrapper getAllTopicConfig(final String addr) throws RemotingConnectException, RemotingSendRequestException,
RemotingTimeoutException, InterruptedException, MQBrokerException { RemotingTimeoutException, InterruptedException, MQBrokerException {
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_TOPIC_CONFIG, null); RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_TOPIC_CONFIG, null);
RemotingCommand response = this.remotingClient.invokeSync(MixAll.brokerVIPChannel(true, addr), request, 3000); RemotingCommand response = this.remotingClient.invokeSync(MixAll.brokerVIPChannel(true, addr), request, 3000);
...@@ -244,7 +250,7 @@ public class BrokerOuterAPI { ...@@ -244,7 +250,7 @@ public class BrokerOuterAPI {
} }
public ConsumerOffsetSerializeWrapper getAllConsumerOffset(final String addr) throws InterruptedException, RemotingTimeoutException, public ConsumerOffsetSerializeWrapper getAllConsumerOffset(final String addr) throws InterruptedException, RemotingTimeoutException,
RemotingSendRequestException, RemotingConnectException, MQBrokerException { RemotingSendRequestException, RemotingConnectException, MQBrokerException {
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_CONSUMER_OFFSET, null); RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_CONSUMER_OFFSET, null);
RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000); RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000);
assert response != null; assert response != null;
...@@ -260,7 +266,7 @@ public class BrokerOuterAPI { ...@@ -260,7 +266,7 @@ public class BrokerOuterAPI {
} }
public String getAllDelayOffset(final String addr) throws InterruptedException, RemotingTimeoutException, RemotingSendRequestException, public String getAllDelayOffset(final String addr) throws InterruptedException, RemotingTimeoutException, RemotingSendRequestException,
RemotingConnectException, MQBrokerException, UnsupportedEncodingException { RemotingConnectException, MQBrokerException, UnsupportedEncodingException {
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_DELAY_OFFSET, null); RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_DELAY_OFFSET, null);
RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000); RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000);
assert response != null; assert response != null;
...@@ -276,7 +282,7 @@ public class BrokerOuterAPI { ...@@ -276,7 +282,7 @@ public class BrokerOuterAPI {
} }
public SubscriptionGroupWrapper getAllSubscriptionGroupConfig(final String addr) throws InterruptedException, RemotingTimeoutException, public SubscriptionGroupWrapper getAllSubscriptionGroupConfig(final String addr) throws InterruptedException, RemotingTimeoutException,
RemotingSendRequestException, RemotingConnectException, MQBrokerException { RemotingSendRequestException, RemotingConnectException, MQBrokerException {
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_SUBSCRIPTIONGROUP_CONFIG, null); RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_ALL_SUBSCRIPTIONGROUP_CONFIG, null);
RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000); RemotingCommand response = this.remotingClient.invokeSync(addr, request, 3000);
assert response != null; assert response != null;
......
...@@ -6,38 +6,34 @@ ...@@ -6,38 +6,34 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.pagecache; package org.apache.rocketmq.broker.pagecache;
import org.apache.rocketmq.store.GetMessageResult;
import io.netty.channel.FileRegion; import io.netty.channel.FileRegion;
import io.netty.util.AbstractReferenceCounted; import io.netty.util.AbstractReferenceCounted;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.util.List; import java.util.List;
import org.apache.rocketmq.store.GetMessageResult;
public class ManyMessageTransfer extends AbstractReferenceCounted implements FileRegion { public class ManyMessageTransfer extends AbstractReferenceCounted implements FileRegion {
private final ByteBuffer byteBufferHeader; private final ByteBuffer byteBufferHeader;
private final GetMessageResult getMessageResult; private final GetMessageResult getMessageResult;
private long transfered; // the bytes which was transfered already private long transfered; // the bytes which was transfered already
public ManyMessageTransfer(ByteBuffer byteBufferHeader, GetMessageResult getMessageResult) { public ManyMessageTransfer(ByteBuffer byteBufferHeader, GetMessageResult getMessageResult) {
this.byteBufferHeader = byteBufferHeader; this.byteBufferHeader = byteBufferHeader;
this.getMessageResult = getMessageResult; this.getMessageResult = getMessageResult;
} }
@Override @Override
public long position() { public long position() {
int pos = byteBufferHeader.position(); int pos = byteBufferHeader.position();
......
...@@ -6,37 +6,33 @@ ...@@ -6,37 +6,33 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.pagecache; package org.apache.rocketmq.broker.pagecache;
import org.apache.rocketmq.store.SelectMappedBufferResult;
import io.netty.channel.FileRegion; import io.netty.channel.FileRegion;
import io.netty.util.AbstractReferenceCounted; import io.netty.util.AbstractReferenceCounted;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import org.apache.rocketmq.store.SelectMappedBufferResult;
public class OneMessageTransfer extends AbstractReferenceCounted implements FileRegion { public class OneMessageTransfer extends AbstractReferenceCounted implements FileRegion {
private final ByteBuffer byteBufferHeader; private final ByteBuffer byteBufferHeader;
private final SelectMappedBufferResult selectMappedBufferResult; private final SelectMappedBufferResult selectMappedBufferResult;
private long transfered; // the bytes which was transfered already private long transfered; // the bytes which was transfered already
public OneMessageTransfer(ByteBuffer byteBufferHeader, SelectMappedBufferResult selectMappedBufferResult) { public OneMessageTransfer(ByteBuffer byteBufferHeader, SelectMappedBufferResult selectMappedBufferResult) {
this.byteBufferHeader = byteBufferHeader; this.byteBufferHeader = byteBufferHeader;
this.selectMappedBufferResult = selectMappedBufferResult; this.selectMappedBufferResult = selectMappedBufferResult;
} }
@Override @Override
public long position() { public long position() {
return this.byteBufferHeader.position() + this.selectMappedBufferResult.getByteBuffer().position(); return this.byteBufferHeader.position() + this.selectMappedBufferResult.getByteBuffer().position();
......
...@@ -6,38 +6,34 @@ ...@@ -6,38 +6,34 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.pagecache; package org.apache.rocketmq.broker.pagecache;
import org.apache.rocketmq.store.QueryMessageResult;
import io.netty.channel.FileRegion; import io.netty.channel.FileRegion;
import io.netty.util.AbstractReferenceCounted; import io.netty.util.AbstractReferenceCounted;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.util.List; import java.util.List;
import org.apache.rocketmq.store.QueryMessageResult;
public class QueryMessageTransfer extends AbstractReferenceCounted implements FileRegion { public class QueryMessageTransfer extends AbstractReferenceCounted implements FileRegion {
private final ByteBuffer byteBufferHeader; private final ByteBuffer byteBufferHeader;
private final QueryMessageResult queryMessageResult; private final QueryMessageResult queryMessageResult;
private long transfered; // the bytes which was transfered already private long transfered; // the bytes which was transfered already
public QueryMessageTransfer(ByteBuffer byteBufferHeader, QueryMessageResult queryMessageResult) { public QueryMessageTransfer(ByteBuffer byteBufferHeader, QueryMessageResult queryMessageResult) {
this.byteBufferHeader = byteBufferHeader; this.byteBufferHeader = byteBufferHeader;
this.queryMessageResult = queryMessageResult; this.queryMessageResult = queryMessageResult;
} }
@Override @Override
public long position() { public long position() {
int pos = byteBufferHeader.position(); int pos = byteBufferHeader.position();
......
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** /**
...@@ -20,12 +20,16 @@ ...@@ -20,12 +20,16 @@
*/ */
package org.apache.rocketmq.broker.plugin; package org.apache.rocketmq.broker.plugin;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import org.apache.rocketmq.store.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set; import java.util.Set;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
import org.apache.rocketmq.store.GetMessageResult;
import org.apache.rocketmq.store.MessageExtBrokerInner;
import org.apache.rocketmq.store.MessageStore;
import org.apache.rocketmq.store.PutMessageResult;
import org.apache.rocketmq.store.QueryMessageResult;
import org.apache.rocketmq.store.SelectMappedBufferResult;
public abstract class AbstractPluginMessageStore implements MessageStore { public abstract class AbstractPluginMessageStore implements MessageStore {
protected MessageStore next = null; protected MessageStore next = null;
...@@ -83,7 +87,7 @@ public abstract class AbstractPluginMessageStore implements MessageStore { ...@@ -83,7 +87,7 @@ public abstract class AbstractPluginMessageStore implements MessageStore {
@Override @Override
public GetMessageResult getMessage(String group, String topic, int queueId, long offset, public GetMessageResult getMessage(String group, String topic, int queueId, long offset,
int maxMsgNums, SubscriptionData subscriptionData) { int maxMsgNums, SubscriptionData subscriptionData) {
return next.getMessage(group, topic, queueId, offset, maxMsgNums, subscriptionData); return next.getMessage(group, topic, queueId, offset, maxMsgNums, subscriptionData);
} }
...@@ -174,7 +178,7 @@ public abstract class AbstractPluginMessageStore implements MessageStore { ...@@ -174,7 +178,7 @@ public abstract class AbstractPluginMessageStore implements MessageStore {
@Override @Override
public QueryMessageResult queryMessage(String topic, String key, int maxNum, long begin, public QueryMessageResult queryMessage(String topic, String key, int maxNum, long begin,
long end) { long end) {
return next.queryMessage(topic, key, maxNum, begin, end); return next.queryMessage(topic, key, maxNum, begin, end);
} }
......
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** /**
...@@ -20,14 +20,13 @@ ...@@ -20,14 +20,13 @@
*/ */
package org.apache.rocketmq.broker.plugin; package org.apache.rocketmq.broker.plugin;
import org.apache.rocketmq.store.MessageStore;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import org.apache.rocketmq.store.MessageStore;
public final class MessageStoreFactory { public final class MessageStoreFactory {
public final static MessageStore build(MessageStorePluginContext context, MessageStore messageStore) public final static MessageStore build(MessageStorePluginContext context, MessageStore messageStore)
throws IOException { throws IOException {
String plugin = context.getBrokerConfig().getMessageStorePlugIn(); String plugin = context.getBrokerConfig().getMessageStorePlugIn();
if (plugin != null && plugin.trim().length() != 0) { if (plugin != null && plugin.trim().length() != 0) {
String[] pluginClasses = plugin.split(","); String[] pluginClasses = plugin.split(",");
...@@ -35,12 +34,12 @@ public final class MessageStoreFactory { ...@@ -35,12 +34,12 @@ public final class MessageStoreFactory {
String pluginClass = pluginClasses[i]; String pluginClass = pluginClasses[i];
try { try {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Class<AbstractPluginMessageStore> clazz = (Class<AbstractPluginMessageStore>) Class.forName(pluginClass); Class<AbstractPluginMessageStore> clazz = (Class<AbstractPluginMessageStore>)Class.forName(pluginClass);
Constructor<AbstractPluginMessageStore> construct = clazz.getConstructor(MessageStorePluginContext.class, MessageStore.class); Constructor<AbstractPluginMessageStore> construct = clazz.getConstructor(MessageStorePluginContext.class, MessageStore.class);
messageStore = construct.newInstance(context, messageStore); messageStore = construct.newInstance(context, messageStore);
} catch (Throwable e) { } catch (Throwable e) {
throw new RuntimeException(String.format( throw new RuntimeException(String.format(
"Initialize plugin's class %s not found!", pluginClass), e); "Initialize plugin's class %s not found!", pluginClass), e);
} }
} }
} }
......
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** /**
...@@ -32,8 +32,8 @@ public class MessageStorePluginContext { ...@@ -32,8 +32,8 @@ public class MessageStorePluginContext {
private BrokerConfig brokerConfig; private BrokerConfig brokerConfig;
public MessageStorePluginContext(MessageStoreConfig messageStoreConfig, public MessageStorePluginContext(MessageStoreConfig messageStoreConfig,
BrokerStatsManager brokerStatsManager, MessageArrivingListener messageArrivingListener, BrokerStatsManager brokerStatsManager, MessageArrivingListener messageArrivingListener,
BrokerConfig brokerConfig) { BrokerConfig brokerConfig) {
super(); super();
this.messageStoreConfig = messageStoreConfig; this.messageStoreConfig = messageStoreConfig;
this.brokerStatsManager = brokerStatsManager; this.brokerStatsManager = brokerStatsManager;
...@@ -57,5 +57,4 @@ public class MessageStorePluginContext { ...@@ -57,5 +57,4 @@ public class MessageStorePluginContext {
return brokerConfig; return brokerConfig;
} }
} }
...@@ -6,16 +6,22 @@ ...@@ -6,16 +6,22 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.mqtrace.SendMessageContext; import org.apache.rocketmq.broker.mqtrace.SendMessageContext;
import org.apache.rocketmq.broker.mqtrace.SendMessageHook; import org.apache.rocketmq.broker.mqtrace.SendMessageHook;
...@@ -42,17 +48,9 @@ import org.apache.rocketmq.remoting.exception.RemotingCommandException; ...@@ -42,17 +48,9 @@ import org.apache.rocketmq.remoting.exception.RemotingCommandException;
import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.store.MessageExtBrokerInner; import org.apache.rocketmq.store.MessageExtBrokerInner;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.List;
import java.util.Map;
import java.util.Random;
public abstract class AbstractSendMessageProcessor implements NettyRequestProcessor { public abstract class AbstractSendMessageProcessor implements NettyRequestProcessor {
protected static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); protected static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
...@@ -62,16 +60,15 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -62,16 +60,15 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
protected final SocketAddress storeHost; protected final SocketAddress storeHost;
private List<SendMessageHook> sendMessageHookList; private List<SendMessageHook> sendMessageHookList;
public AbstractSendMessageProcessor(final BrokerController brokerController) { public AbstractSendMessageProcessor(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
this.storeHost = this.storeHost =
new InetSocketAddress(brokerController.getBrokerConfig().getBrokerIP1(), brokerController new InetSocketAddress(brokerController.getBrokerConfig().getBrokerIP1(), brokerController
.getNettyServerConfig().getListenPort()); .getNettyServerConfig().getListenPort());
} }
protected SendMessageContext buildMsgContext(ChannelHandlerContext ctx, protected SendMessageContext buildMsgContext(ChannelHandlerContext ctx,
SendMessageRequestHeader requestHeader) { SendMessageRequestHeader requestHeader) {
if (!this.hasSendMessageHook()) { if (!this.hasSendMessageHook()) {
return null; return null;
} }
...@@ -91,7 +88,6 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -91,7 +88,6 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
properties.put(MessageConst.PROPERTY_TRACE_SWITCH, String.valueOf(this.brokerController.getBrokerConfig().isTraceOn())); properties.put(MessageConst.PROPERTY_TRACE_SWITCH, String.valueOf(this.brokerController.getBrokerConfig().isTraceOn()));
requestHeader.setProperties(MessageDecoder.messageProperties2String(properties)); requestHeader.setProperties(MessageDecoder.messageProperties2String(properties));
if (uniqueKey == null) { if (uniqueKey == null) {
uniqueKey = ""; uniqueKey = "";
} }
...@@ -104,7 +100,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -104,7 +100,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
protected MessageExtBrokerInner buildInnerMsg(final ChannelHandlerContext ctx, protected MessageExtBrokerInner buildInnerMsg(final ChannelHandlerContext ctx,
final SendMessageRequestHeader requestHeader, final byte[] body, TopicConfig topicConfig) { final SendMessageRequestHeader requestHeader, final byte[] body, TopicConfig topicConfig) {
int queueIdInt = requestHeader.getQueueId(); int queueIdInt = requestHeader.getQueueId();
if (queueIdInt < 0) { if (queueIdInt < 0) {
queueIdInt = Math.abs(this.random.nextInt() % 99999999) % topicConfig.getWriteQueueNums(); queueIdInt = Math.abs(this.random.nextInt() % 99999999) % topicConfig.getWriteQueueNums();
...@@ -120,10 +116,10 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -120,10 +116,10 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
msgInner.setBody(body); msgInner.setBody(body);
msgInner.setFlag(requestHeader.getFlag()); msgInner.setFlag(requestHeader.getFlag());
MessageAccessor.setProperties(msgInner, MessageAccessor.setProperties(msgInner,
MessageDecoder.string2messageProperties(requestHeader.getProperties())); MessageDecoder.string2messageProperties(requestHeader.getProperties()));
msgInner.setPropertiesString(requestHeader.getProperties()); msgInner.setPropertiesString(requestHeader.getProperties());
msgInner.setTagsCode(MessageExtBrokerInner.tagsString2tagsCode(topicConfig.getTopicFilterType(), msgInner.setTagsCode(MessageExtBrokerInner.tagsString2tagsCode(topicConfig.getTopicFilterType(),
msgInner.getTags())); msgInner.getTags()));
msgInner.setQueueId(queueIdInt); msgInner.setQueueId(queueIdInt);
msgInner.setSysFlag(sysFlag); msgInner.setSysFlag(sysFlag);
...@@ -131,7 +127,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -131,7 +127,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
msgInner.setBornHost(ctx.channel().remoteAddress()); msgInner.setBornHost(ctx.channel().remoteAddress());
msgInner.setStoreHost(this.getStoreHost()); msgInner.setStoreHost(this.getStoreHost());
msgInner.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader msgInner.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader
.getReconsumeTimes()); .getReconsumeTimes());
return msgInner; return msgInner;
} }
...@@ -140,8 +136,8 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -140,8 +136,8 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
protected RemotingCommand msgContentCheck(final ChannelHandlerContext ctx, protected RemotingCommand msgContentCheck(final ChannelHandlerContext ctx,
final SendMessageRequestHeader requestHeader, RemotingCommand request, final SendMessageRequestHeader requestHeader, RemotingCommand request,
final RemotingCommand response) { final RemotingCommand response) {
if (requestHeader.getTopic().length() > Byte.MAX_VALUE) { if (requestHeader.getTopic().length() > Byte.MAX_VALUE) {
log.warn("putMessage message topic length too long " + requestHeader.getTopic().length()); log.warn("putMessage message topic length too long " + requestHeader.getTopic().length());
response.setCode(ResponseCode.MESSAGE_ILLEGAL); response.setCode(ResponseCode.MESSAGE_ILLEGAL);
...@@ -149,13 +145,13 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -149,13 +145,13 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
if (requestHeader.getProperties() != null && requestHeader.getProperties().length() > Short.MAX_VALUE) { if (requestHeader.getProperties() != null && requestHeader.getProperties().length() > Short.MAX_VALUE) {
log.warn("putMessage message properties length too long " log.warn("putMessage message properties length too long "
+ requestHeader.getProperties().length()); + requestHeader.getProperties().length());
response.setCode(ResponseCode.MESSAGE_ILLEGAL); response.setCode(ResponseCode.MESSAGE_ILLEGAL);
return response; return response;
} }
if (request.getBody().length > DBMsgConstants.MAX_BODY_SIZE) { if (request.getBody().length > DBMsgConstants.MAX_BODY_SIZE) {
log.warn(" topic {} msg body size {} from {}", requestHeader.getTopic(), log.warn(" topic {} msg body size {} from {}", requestHeader.getTopic(),
request.getBody().length, ChannelUtil.getRemoteIp(ctx.channel())); request.getBody().length, ChannelUtil.getRemoteIp(ctx.channel()));
response.setRemark("msg body must be less 64KB"); response.setRemark("msg body must be less 64KB");
response.setCode(ResponseCode.MESSAGE_ILLEGAL); response.setCode(ResponseCode.MESSAGE_ILLEGAL);
return response; return response;
...@@ -164,12 +160,12 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -164,12 +160,12 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
protected RemotingCommand msgCheck(final ChannelHandlerContext ctx, protected RemotingCommand msgCheck(final ChannelHandlerContext ctx,
final SendMessageRequestHeader requestHeader, final RemotingCommand response) { final SendMessageRequestHeader requestHeader, final RemotingCommand response) {
if (!PermName.isWriteable(this.brokerController.getBrokerConfig().getBrokerPermission()) if (!PermName.isWriteable(this.brokerController.getBrokerConfig().getBrokerPermission())
&& this.brokerController.getTopicConfigManager().isOrderTopic(requestHeader.getTopic())) { && this.brokerController.getTopicConfigManager().isOrderTopic(requestHeader.getTopic())) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1()
+ "] sending message is forbidden"); + "] sending message is forbidden");
return response; return response;
} }
if (!this.brokerController.getTopicConfigManager().isTopicCanSendMessage(requestHeader.getTopic())) { if (!this.brokerController.getTopicConfigManager().isTopicCanSendMessage(requestHeader.getTopic())) {
...@@ -181,7 +177,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -181,7 +177,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
TopicConfig topicConfig = TopicConfig topicConfig =
this.brokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic()); this.brokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic());
if (null == topicConfig) { if (null == topicConfig) {
int topicSysFlag = 0; int topicSysFlag = 0;
if (requestHeader.isUnitMode()) { if (requestHeader.isUnitMode()) {
...@@ -193,26 +189,26 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -193,26 +189,26 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
log.warn("the topic " + requestHeader.getTopic() + " not exist, producer: " log.warn("the topic " + requestHeader.getTopic() + " not exist, producer: "
+ ctx.channel().remoteAddress()); + ctx.channel().remoteAddress());
topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageMethod(// topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageMethod(//
requestHeader.getTopic(), // requestHeader.getTopic(), //
requestHeader.getDefaultTopic(), // requestHeader.getDefaultTopic(), //
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), // RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.getDefaultTopicQueueNums(), topicSysFlag); requestHeader.getDefaultTopicQueueNums(), topicSysFlag);
if (null == topicConfig) { if (null == topicConfig) {
if (requestHeader.getTopic().startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) { if (requestHeader.getTopic().startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) {
topicConfig = topicConfig =
this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod( this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(
requestHeader.getTopic(), 1, PermName.PERM_WRITE | PermName.PERM_READ, requestHeader.getTopic(), 1, PermName.PERM_WRITE | PermName.PERM_READ,
topicSysFlag); topicSysFlag);
} }
} }
if (null == topicConfig) { if (null == topicConfig) {
response.setCode(ResponseCode.TOPIC_NOT_EXIST); response.setCode(ResponseCode.TOPIC_NOT_EXIST);
response.setRemark("topic[" + requestHeader.getTopic() + "] not exist, apply first please!" response.setRemark("topic[" + requestHeader.getTopic() + "] not exist, apply first please!"
+ FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL)); + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL));
return response; return response;
} }
} }
...@@ -221,9 +217,9 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -221,9 +217,9 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
int idValid = Math.max(topicConfig.getWriteQueueNums(), topicConfig.getReadQueueNums()); int idValid = Math.max(topicConfig.getWriteQueueNums(), topicConfig.getReadQueueNums());
if (queueIdInt >= idValid) { if (queueIdInt >= idValid) {
String errorInfo = String.format("request queueId[%d] is illagal, %s Producer: %s", String errorInfo = String.format("request queueId[%d] is illagal, %s Producer: %s",
queueIdInt, queueIdInt,
topicConfig.toString(), topicConfig.toString(),
RemotingHelper.parseChannelRemoteAddr(ctx.channel())); RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
log.warn(errorInfo); log.warn(errorInfo);
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
...@@ -239,7 +235,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -239,7 +235,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
protected void doResponse(ChannelHandlerContext ctx, RemotingCommand request, protected void doResponse(ChannelHandlerContext ctx, RemotingCommand request,
final RemotingCommand response) { final RemotingCommand response) {
if (!request.isOnewayRPC()) { if (!request.isOnewayRPC()) {
try { try {
ctx.writeAndFlush(response); ctx.writeAndFlush(response);
...@@ -252,7 +248,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -252,7 +248,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
public void executeSendMessageHookBefore(final ChannelHandlerContext ctx, final RemotingCommand request, public void executeSendMessageHookBefore(final ChannelHandlerContext ctx, final RemotingCommand request,
SendMessageContext context) { SendMessageContext context) {
if (hasSendMessageHook()) { if (hasSendMessageHook()) {
for (SendMessageHook hook : this.sendMessageHookList) { for (SendMessageHook hook : this.sendMessageHookList) {
try { try {
...@@ -280,20 +276,20 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -280,20 +276,20 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
} }
protected SendMessageRequestHeader parseRequestHeader(RemotingCommand request) protected SendMessageRequestHeader parseRequestHeader(RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
SendMessageRequestHeaderV2 requestHeaderV2 = null; SendMessageRequestHeaderV2 requestHeaderV2 = null;
SendMessageRequestHeader requestHeader = null; SendMessageRequestHeader requestHeader = null;
switch (request.getCode()) { switch (request.getCode()) {
case RequestCode.SEND_MESSAGE_V2: case RequestCode.SEND_MESSAGE_V2:
requestHeaderV2 = requestHeaderV2 =
(SendMessageRequestHeaderV2) request (SendMessageRequestHeaderV2)request
.decodeCommandCustomHeader(SendMessageRequestHeaderV2.class); .decodeCommandCustomHeader(SendMessageRequestHeaderV2.class);
case RequestCode.SEND_MESSAGE: case RequestCode.SEND_MESSAGE:
if (null == requestHeaderV2) { if (null == requestHeaderV2) {
requestHeader = requestHeader =
(SendMessageRequestHeader) request (SendMessageRequestHeader)request
.decodeCommandCustomHeader(SendMessageRequestHeader.class); .decodeCommandCustomHeader(SendMessageRequestHeader.class);
} else { } else {
requestHeader = SendMessageRequestHeaderV2.createSendMessageRequestHeaderV1(requestHeaderV2); requestHeader = SendMessageRequestHeaderV2.createSendMessageRequestHeaderV1(requestHeaderV2);
} }
...@@ -309,7 +305,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces ...@@ -309,7 +305,7 @@ public abstract class AbstractSendMessageProcessor implements NettyRequestProces
try { try {
if (response != null) { if (response != null) {
final SendMessageResponseHeader responseHeader = final SendMessageResponseHeader responseHeader =
(SendMessageResponseHeader) response.readCustomHeader(); (SendMessageResponseHeader)response.readCustomHeader();
context.setMsgId(responseHeader.getMsgId()); context.setMsgId(responseHeader.getMsgId());
context.setQueueId(responseHeader.getQueueId()); context.setQueueId(responseHeader.getQueueId());
context.setQueueOffset(responseHeader.getQueueOffset()); context.setQueueOffset(responseHeader.getQueueOffset());
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.client.ClientChannelInfo; import org.apache.rocketmq.broker.client.ClientChannelInfo;
import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.MixAll;
...@@ -34,11 +35,9 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; ...@@ -34,11 +35,9 @@ import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingCommandException; import org.apache.rocketmq.remoting.exception.RemotingCommandException;
import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class ClientManageProcessor implements NettyRequestProcessor { public class ClientManageProcessor implements NettyRequestProcessor {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
...@@ -49,7 +48,7 @@ public class ClientManageProcessor implements NettyRequestProcessor { ...@@ -49,7 +48,7 @@ public class ClientManageProcessor implements NettyRequestProcessor {
@Override @Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
switch (request.getCode()) { switch (request.getCode()) {
case RequestCode.HEART_BEAT: case RequestCode.HEART_BEAT:
return this.heartBeat(ctx, request); return this.heartBeat(ctx, request);
...@@ -70,16 +69,16 @@ public class ClientManageProcessor implements NettyRequestProcessor { ...@@ -70,16 +69,16 @@ public class ClientManageProcessor implements NettyRequestProcessor {
RemotingCommand response = RemotingCommand.createResponseCommand(null); RemotingCommand response = RemotingCommand.createResponseCommand(null);
HeartbeatData heartbeatData = HeartbeatData.decode(request.getBody(), HeartbeatData.class); HeartbeatData heartbeatData = HeartbeatData.decode(request.getBody(), HeartbeatData.class);
ClientChannelInfo clientChannelInfo = new ClientChannelInfo( ClientChannelInfo clientChannelInfo = new ClientChannelInfo(
ctx.channel(), ctx.channel(),
heartbeatData.getClientID(), heartbeatData.getClientID(),
request.getLanguage(), request.getLanguage(),
request.getVersion() request.getVersion()
); );
for (ConsumerData data : heartbeatData.getConsumerDataSet()) { for (ConsumerData data : heartbeatData.getConsumerDataSet()) {
SubscriptionGroupConfig subscriptionGroupConfig = SubscriptionGroupConfig subscriptionGroupConfig =
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig( this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(
data.getGroupName()); data.getGroupName());
boolean isNotifyConsumerIdsChangedEnable = true; boolean isNotifyConsumerIdsChangedEnable = true;
if (null != subscriptionGroupConfig) { if (null != subscriptionGroupConfig) {
isNotifyConsumerIdsChangedEnable = subscriptionGroupConfig.isNotifyConsumerIdsChangedEnable(); isNotifyConsumerIdsChangedEnable = subscriptionGroupConfig.isNotifyConsumerIdsChangedEnable();
...@@ -89,32 +88,32 @@ public class ClientManageProcessor implements NettyRequestProcessor { ...@@ -89,32 +88,32 @@ public class ClientManageProcessor implements NettyRequestProcessor {
} }
String newTopic = MixAll.getRetryTopic(data.getGroupName()); String newTopic = MixAll.getRetryTopic(data.getGroupName());
this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod( this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(
newTopic, newTopic,
subscriptionGroupConfig.getRetryQueueNums(), subscriptionGroupConfig.getRetryQueueNums(),
PermName.PERM_WRITE | PermName.PERM_READ, topicSysFlag); PermName.PERM_WRITE | PermName.PERM_READ, topicSysFlag);
} }
boolean changed = this.brokerController.getConsumerManager().registerConsumer( boolean changed = this.brokerController.getConsumerManager().registerConsumer(
data.getGroupName(), data.getGroupName(),
clientChannelInfo, clientChannelInfo,
data.getConsumeType(), data.getConsumeType(),
data.getMessageModel(), data.getMessageModel(),
data.getConsumeFromWhere(), data.getConsumeFromWhere(),
data.getSubscriptionDataSet(), data.getSubscriptionDataSet(),
isNotifyConsumerIdsChangedEnable isNotifyConsumerIdsChangedEnable
); );
if (changed) { if (changed) {
log.info("registerConsumer info changed {} {}", log.info("registerConsumer info changed {} {}",
data.toString(), data.toString(),
RemotingHelper.parseChannelRemoteAddr(ctx.channel()) RemotingHelper.parseChannelRemoteAddr(ctx.channel())
); );
} }
} }
for (ProducerData data : heartbeatData.getProducerDataSet()) { for (ProducerData data : heartbeatData.getProducerDataSet()) {
this.brokerController.getProducerManager().registerProducer(data.getGroupName(), this.brokerController.getProducerManager().registerProducer(data.getGroupName(),
clientChannelInfo); clientChannelInfo);
} }
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
...@@ -122,18 +121,18 @@ public class ClientManageProcessor implements NettyRequestProcessor { ...@@ -122,18 +121,18 @@ public class ClientManageProcessor implements NettyRequestProcessor {
} }
public RemotingCommand unregisterClient(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand unregisterClient(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = final RemotingCommand response =
RemotingCommand.createResponseCommand(UnregisterClientResponseHeader.class); RemotingCommand.createResponseCommand(UnregisterClientResponseHeader.class);
final UnregisterClientRequestHeader requestHeader = final UnregisterClientRequestHeader requestHeader =
(UnregisterClientRequestHeader) request (UnregisterClientRequestHeader)request
.decodeCommandCustomHeader(UnregisterClientRequestHeader.class); .decodeCommandCustomHeader(UnregisterClientRequestHeader.class);
ClientChannelInfo clientChannelInfo = new ClientChannelInfo( ClientChannelInfo clientChannelInfo = new ClientChannelInfo(
ctx.channel(), ctx.channel(),
requestHeader.getClientID(), requestHeader.getClientID(),
request.getLanguage(), request.getLanguage(),
request.getVersion()); request.getVersion());
{ {
final String group = requestHeader.getProducerGroup(); final String group = requestHeader.getProducerGroup();
if (group != null) { if (group != null) {
...@@ -145,7 +144,7 @@ public class ClientManageProcessor implements NettyRequestProcessor { ...@@ -145,7 +144,7 @@ public class ClientManageProcessor implements NettyRequestProcessor {
final String group = requestHeader.getConsumerGroup(); final String group = requestHeader.getConsumerGroup();
if (group != null) { if (group != null) {
SubscriptionGroupConfig subscriptionGroupConfig = SubscriptionGroupConfig subscriptionGroupConfig =
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(group); this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(group);
boolean isNotifyConsumerIdsChangedEnable = true; boolean isNotifyConsumerIdsChangedEnable = true;
if (null != subscriptionGroupConfig) { if (null != subscriptionGroupConfig) {
isNotifyConsumerIdsChangedEnable = subscriptionGroupConfig.isNotifyConsumerIdsChangedEnable(); isNotifyConsumerIdsChangedEnable = subscriptionGroupConfig.isNotifyConsumerIdsChangedEnable();
......
...@@ -16,36 +16,39 @@ ...@@ -16,36 +16,39 @@
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import java.util.List;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.client.ConsumerGroupInfo; import org.apache.rocketmq.broker.client.ConsumerGroupInfo;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.protocol.RequestCode; import org.apache.rocketmq.common.protocol.RequestCode;
import org.apache.rocketmq.common.protocol.ResponseCode; import org.apache.rocketmq.common.protocol.ResponseCode;
import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupRequestHeader;
import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseBody;
import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupResponseHeader;
import org.apache.rocketmq.common.protocol.header.QueryConsumerOffsetRequestHeader;
import org.apache.rocketmq.common.protocol.header.QueryConsumerOffsetResponseHeader;
import org.apache.rocketmq.common.protocol.header.UpdateConsumerOffsetRequestHeader;
import org.apache.rocketmq.common.protocol.header.UpdateConsumerOffsetResponseHeader;
import org.apache.rocketmq.remoting.common.RemotingHelper; import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingCommandException; import org.apache.rocketmq.remoting.exception.RemotingCommandException;
import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import io.netty.channel.ChannelHandlerContext;
import org.apache.rocketmq.common.protocol.header.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.List;
public class ConsumerManageProcessor implements NettyRequestProcessor { public class ConsumerManageProcessor implements NettyRequestProcessor {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
public ConsumerManageProcessor(final BrokerController brokerController) { public ConsumerManageProcessor(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
@Override @Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
switch (request.getCode()) { switch (request.getCode()) {
case RequestCode.GET_CONSUMER_LIST_BY_GROUP: case RequestCode.GET_CONSUMER_LIST_BY_GROUP:
return this.getConsumerListByGroup(ctx, request); return this.getConsumerListByGroup(ctx, request);
...@@ -64,18 +67,17 @@ public class ConsumerManageProcessor implements NettyRequestProcessor { ...@@ -64,18 +67,17 @@ public class ConsumerManageProcessor implements NettyRequestProcessor {
return false; return false;
} }
public RemotingCommand getConsumerListByGroup(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand getConsumerListByGroup(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = final RemotingCommand response =
RemotingCommand.createResponseCommand(GetConsumerListByGroupResponseHeader.class); RemotingCommand.createResponseCommand(GetConsumerListByGroupResponseHeader.class);
final GetConsumerListByGroupRequestHeader requestHeader = final GetConsumerListByGroupRequestHeader requestHeader =
(GetConsumerListByGroupRequestHeader) request (GetConsumerListByGroupRequestHeader)request
.decodeCommandCustomHeader(GetConsumerListByGroupRequestHeader.class); .decodeCommandCustomHeader(GetConsumerListByGroupRequestHeader.class);
ConsumerGroupInfo consumerGroupInfo = ConsumerGroupInfo consumerGroupInfo =
this.brokerController.getConsumerManager().getConsumerGroupInfo( this.brokerController.getConsumerManager().getConsumerGroupInfo(
requestHeader.getConsumerGroup()); requestHeader.getConsumerGroup());
if (consumerGroupInfo != null) { if (consumerGroupInfo != null) {
List<String> clientIds = consumerGroupInfo.getAllClientId(); List<String> clientIds = consumerGroupInfo.getAllClientId();
if (!clientIds.isEmpty()) { if (!clientIds.isEmpty()) {
...@@ -87,11 +89,11 @@ public class ConsumerManageProcessor implements NettyRequestProcessor { ...@@ -87,11 +89,11 @@ public class ConsumerManageProcessor implements NettyRequestProcessor {
return response; return response;
} else { } else {
log.warn("getAllClientId failed, {} {}", requestHeader.getConsumerGroup(), log.warn("getAllClientId failed, {} {}", requestHeader.getConsumerGroup(),
RemotingHelper.parseChannelRemoteAddr(ctx.channel())); RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
} }
} else { } else {
log.warn("getConsumerGroupInfo failed, {} {}", requestHeader.getConsumerGroup(), log.warn("getConsumerGroupInfo failed, {} {}", requestHeader.getConsumerGroup(),
RemotingHelper.parseChannelRemoteAddr(ctx.channel())); RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
} }
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
...@@ -100,34 +102,32 @@ public class ConsumerManageProcessor implements NettyRequestProcessor { ...@@ -100,34 +102,32 @@ public class ConsumerManageProcessor implements NettyRequestProcessor {
} }
private RemotingCommand updateConsumerOffset(ChannelHandlerContext ctx, RemotingCommand request) private RemotingCommand updateConsumerOffset(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = final RemotingCommand response =
RemotingCommand.createResponseCommand(UpdateConsumerOffsetResponseHeader.class); RemotingCommand.createResponseCommand(UpdateConsumerOffsetResponseHeader.class);
final UpdateConsumerOffsetRequestHeader requestHeader = final UpdateConsumerOffsetRequestHeader requestHeader =
(UpdateConsumerOffsetRequestHeader) request (UpdateConsumerOffsetRequestHeader)request
.decodeCommandCustomHeader(UpdateConsumerOffsetRequestHeader.class); .decodeCommandCustomHeader(UpdateConsumerOffsetRequestHeader.class);
this.brokerController.getConsumerOffsetManager().commitOffset(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), requestHeader.getConsumerGroup(), this.brokerController.getConsumerOffsetManager().commitOffset(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), requestHeader.getConsumerGroup(),
requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getCommitOffset()); requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getCommitOffset());
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
return response; return response;
} }
private RemotingCommand queryConsumerOffset(ChannelHandlerContext ctx, RemotingCommand request) private RemotingCommand queryConsumerOffset(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = final RemotingCommand response =
RemotingCommand.createResponseCommand(QueryConsumerOffsetResponseHeader.class); RemotingCommand.createResponseCommand(QueryConsumerOffsetResponseHeader.class);
final QueryConsumerOffsetResponseHeader responseHeader = final QueryConsumerOffsetResponseHeader responseHeader =
(QueryConsumerOffsetResponseHeader) response.readCustomHeader(); (QueryConsumerOffsetResponseHeader)response.readCustomHeader();
final QueryConsumerOffsetRequestHeader requestHeader = final QueryConsumerOffsetRequestHeader requestHeader =
(QueryConsumerOffsetRequestHeader) request (QueryConsumerOffsetRequestHeader)request
.decodeCommandCustomHeader(QueryConsumerOffsetRequestHeader.class); .decodeCommandCustomHeader(QueryConsumerOffsetRequestHeader.class);
long offset = long offset =
this.brokerController.getConsumerOffsetManager().queryOffset( this.brokerController.getConsumerOffsetManager().queryOffset(
requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId()); requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId());
if (offset >= 0) { if (offset >= 0) {
responseHeader.setOffset(offset); responseHeader.setOffset(offset);
...@@ -135,11 +135,11 @@ public class ConsumerManageProcessor implements NettyRequestProcessor { ...@@ -135,11 +135,11 @@ public class ConsumerManageProcessor implements NettyRequestProcessor {
response.setRemark(null); response.setRemark(null);
} else { } else {
long minOffset = long minOffset =
this.brokerController.getMessageStore().getMinOffsetInQuque(requestHeader.getTopic(), this.brokerController.getMessageStore().getMinOffsetInQuque(requestHeader.getTopic(),
requestHeader.getQueueId()); requestHeader.getQueueId());
if (minOffset <= 0 if (minOffset <= 0
&& !this.brokerController.getMessageStore().checkInDiskByConsumeOffset( && !this.brokerController.getMessageStore().checkInDiskByConsumeOffset(
requestHeader.getTopic(), requestHeader.getQueueId(), 0)) { requestHeader.getTopic(), requestHeader.getQueueId(), 0)) {
responseHeader.setOffset(0L); responseHeader.setOffset(0L);
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.common.TopicFilterType; import org.apache.rocketmq.common.TopicFilterType;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
...@@ -33,11 +34,9 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; ...@@ -33,11 +34,9 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.store.MessageExtBrokerInner; import org.apache.rocketmq.store.MessageExtBrokerInner;
import org.apache.rocketmq.store.MessageStore; import org.apache.rocketmq.store.MessageStore;
import org.apache.rocketmq.store.PutMessageResult; import org.apache.rocketmq.store.PutMessageResult;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class EndTransactionProcessor implements NettyRequestProcessor { public class EndTransactionProcessor implements NettyRequestProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME); private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
...@@ -50,36 +49,35 @@ public class EndTransactionProcessor implements NettyRequestProcessor { ...@@ -50,36 +49,35 @@ public class EndTransactionProcessor implements NettyRequestProcessor {
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException { public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null); final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final EndTransactionRequestHeader requestHeader = final EndTransactionRequestHeader requestHeader =
(EndTransactionRequestHeader) request.decodeCommandCustomHeader(EndTransactionRequestHeader.class); (EndTransactionRequestHeader)request.decodeCommandCustomHeader(EndTransactionRequestHeader.class);
if (requestHeader.getFromTransactionCheck()) { if (requestHeader.getFromTransactionCheck()) {
switch (requestHeader.getCommitOrRollback()) { switch (requestHeader.getCommitOrRollback()) {
case MessageSysFlag.TRANSACTION_NOT_TYPE: { case MessageSysFlag.TRANSACTION_NOT_TYPE: {
LOGGER.warn("check producer[{}] transaction state, but it's pending status." LOGGER.warn("check producer[{}] transaction state, but it's pending status."
+ "RequestHeader: {} Remark: {}", + "RequestHeader: {} Remark: {}",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
requestHeader.toString(), requestHeader.toString(),
request.getRemark()); request.getRemark());
return null; return null;
} }
case MessageSysFlag.TRANSACTION_COMMIT_TYPE: { case MessageSysFlag.TRANSACTION_COMMIT_TYPE: {
LOGGER.warn("check producer[{}] transaction state, the producer commit the message." LOGGER.warn("check producer[{}] transaction state, the producer commit the message."
+ "RequestHeader: {} Remark: {}", + "RequestHeader: {} Remark: {}",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
requestHeader.toString(), requestHeader.toString(),
request.getRemark()); request.getRemark());
break; break;
} }
case MessageSysFlag.TRANSACTION_ROLLBACK_TYPE: { case MessageSysFlag.TRANSACTION_ROLLBACK_TYPE: {
LOGGER.warn("check producer[{}] transaction state, the producer rollback the message." LOGGER.warn("check producer[{}] transaction state, the producer rollback the message."
+ "RequestHeader: {} Remark: {}", + "RequestHeader: {} Remark: {}",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
requestHeader.toString(), requestHeader.toString(),
request.getRemark()); request.getRemark());
break; break;
} }
default: default:
...@@ -89,10 +87,10 @@ public class EndTransactionProcessor implements NettyRequestProcessor { ...@@ -89,10 +87,10 @@ public class EndTransactionProcessor implements NettyRequestProcessor {
switch (requestHeader.getCommitOrRollback()) { switch (requestHeader.getCommitOrRollback()) {
case MessageSysFlag.TRANSACTION_NOT_TYPE: { case MessageSysFlag.TRANSACTION_NOT_TYPE: {
LOGGER.warn("the producer[{}] end transaction in sending message, and it's pending status." LOGGER.warn("the producer[{}] end transaction in sending message, and it's pending status."
+ "RequestHeader: {} Remark: {}", + "RequestHeader: {} Remark: {}",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
requestHeader.toString(), requestHeader.toString(),
request.getRemark()); request.getRemark());
return null; return null;
} }
...@@ -102,10 +100,10 @@ public class EndTransactionProcessor implements NettyRequestProcessor { ...@@ -102,10 +100,10 @@ public class EndTransactionProcessor implements NettyRequestProcessor {
case MessageSysFlag.TRANSACTION_ROLLBACK_TYPE: { case MessageSysFlag.TRANSACTION_ROLLBACK_TYPE: {
LOGGER.warn("the producer[{}] end transaction in sending message, rollback the message." LOGGER.warn("the producer[{}] end transaction in sending message, rollback the message."
+ "RequestHeader: {} Remark: {}", + "RequestHeader: {} Remark: {}",
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
requestHeader.toString(), requestHeader.toString(),
request.getRemark()); request.getRemark());
break; break;
} }
default: default:
...@@ -210,8 +208,8 @@ public class EndTransactionProcessor implements NettyRequestProcessor { ...@@ -210,8 +208,8 @@ public class EndTransactionProcessor implements NettyRequestProcessor {
MessageAccessor.setProperties(msgInner, msgExt.getProperties()); MessageAccessor.setProperties(msgInner, msgExt.getProperties());
TopicFilterType topicFilterType = TopicFilterType topicFilterType =
(msgInner.getSysFlag() & MessageSysFlag.MULTI_TAGS_FLAG) == MessageSysFlag.MULTI_TAGS_FLAG ? TopicFilterType.MULTI_TAG (msgInner.getSysFlag() & MessageSysFlag.MULTI_TAGS_FLAG) == MessageSysFlag.MULTI_TAGS_FLAG ? TopicFilterType.MULTI_TAG
: TopicFilterType.SINGLE_TAG; : TopicFilterType.SINGLE_TAG;
long tagsCodeValue = MessageExtBrokerInner.tagsString2tagsCode(topicFilterType, msgInner.getTags()); long tagsCodeValue = MessageExtBrokerInner.tagsString2tagsCode(topicFilterType, msgInner.getTags());
msgInner.setTagsCode(tagsCodeValue); msgInner.setTagsCode(tagsCodeValue);
msgInner.setPropertiesString(MessageDecoder.messageProperties2String(msgExt.getProperties())); msgInner.setPropertiesString(MessageDecoder.messageProperties2String(msgExt.getProperties()));
......
...@@ -6,36 +6,33 @@ ...@@ -6,36 +6,33 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class ForwardRequestProcessor implements NettyRequestProcessor { public class ForwardRequestProcessor implements NettyRequestProcessor {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
public ForwardRequestProcessor(final BrokerController brokerController) { public ForwardRequestProcessor(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
@Override @Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) { public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) {
return null; return null;
......
...@@ -16,6 +16,13 @@ ...@@ -16,6 +16,13 @@
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.FileRegion;
import java.nio.ByteBuffer;
import java.util.List;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.client.ConsumerGroupInfo; import org.apache.rocketmq.broker.client.ConsumerGroupInfo;
import org.apache.rocketmq.broker.longpolling.PullRequest; import org.apache.rocketmq.broker.longpolling.PullRequest;
...@@ -49,14 +56,9 @@ import org.apache.rocketmq.store.MessageExtBrokerInner; ...@@ -49,14 +56,9 @@ import org.apache.rocketmq.store.MessageExtBrokerInner;
import org.apache.rocketmq.store.PutMessageResult; import org.apache.rocketmq.store.PutMessageResult;
import org.apache.rocketmq.store.config.BrokerRole; import org.apache.rocketmq.store.config.BrokerRole;
import org.apache.rocketmq.store.stats.BrokerStatsManager; import org.apache.rocketmq.store.stats.BrokerStatsManager;
import io.netty.channel.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
import java.util.List;
public class PullMessageProcessor implements NettyRequestProcessor { public class PullMessageProcessor implements NettyRequestProcessor {
private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
...@@ -77,12 +79,11 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -77,12 +79,11 @@ public class PullMessageProcessor implements NettyRequestProcessor {
} }
private RemotingCommand processRequest(final Channel channel, RemotingCommand request, boolean brokerAllowSuspend) private RemotingCommand processRequest(final Channel channel, RemotingCommand request, boolean brokerAllowSuspend)
throws RemotingCommandException { throws RemotingCommandException {
RemotingCommand response = RemotingCommand.createResponseCommand(PullMessageResponseHeader.class); RemotingCommand response = RemotingCommand.createResponseCommand(PullMessageResponseHeader.class);
final PullMessageResponseHeader responseHeader = (PullMessageResponseHeader) response.readCustomHeader(); final PullMessageResponseHeader responseHeader = (PullMessageResponseHeader)response.readCustomHeader();
final PullMessageRequestHeader requestHeader = final PullMessageRequestHeader requestHeader =
(PullMessageRequestHeader) request.decodeCommandCustomHeader(PullMessageRequestHeader.class); (PullMessageRequestHeader)request.decodeCommandCustomHeader(PullMessageRequestHeader.class);
response.setOpaque(request.getOpaque()); response.setOpaque(request.getOpaque());
...@@ -90,24 +91,21 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -90,24 +91,21 @@ public class PullMessageProcessor implements NettyRequestProcessor {
LOG.debug("receive PullMessage request command, " + request); LOG.debug("receive PullMessage request command, " + request);
} }
if (!PermName.isReadable(this.brokerController.getBrokerConfig().getBrokerPermission())) { if (!PermName.isReadable(this.brokerController.getBrokerConfig().getBrokerPermission())) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] pulling message is forbidden"); response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] pulling message is forbidden");
return response; return response;
} }
SubscriptionGroupConfig subscriptionGroupConfig = SubscriptionGroupConfig subscriptionGroupConfig =
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(requestHeader.getConsumerGroup()); this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(requestHeader.getConsumerGroup());
if (null == subscriptionGroupConfig) { if (null == subscriptionGroupConfig) {
response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST); response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST);
response.setRemark("subscription group not exist, " + requestHeader.getConsumerGroup() + " " response.setRemark("subscription group not exist, " + requestHeader.getConsumerGroup() + " "
+ FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST)); + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST));
return response; return response;
} }
if (!subscriptionGroupConfig.isConsumeEnable()) { if (!subscriptionGroupConfig.isConsumeEnable()) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("subscription group no permission, " + requestHeader.getConsumerGroup()); response.setRemark("subscription group no permission, " + requestHeader.getConsumerGroup());
...@@ -120,49 +118,45 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -120,49 +118,45 @@ public class PullMessageProcessor implements NettyRequestProcessor {
final long suspendTimeoutMillisLong = hasSuspendFlag ? requestHeader.getSuspendTimeoutMillis() : 0; final long suspendTimeoutMillisLong = hasSuspendFlag ? requestHeader.getSuspendTimeoutMillis() : 0;
TopicConfig topicConfig = this.brokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic()); TopicConfig topicConfig = this.brokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic());
if (null == topicConfig) { if (null == topicConfig) {
LOG.error("the topic " + requestHeader.getTopic() + " not exist, consumer: " + RemotingHelper.parseChannelRemoteAddr(channel)); LOG.error("the topic " + requestHeader.getTopic() + " not exist, consumer: " + RemotingHelper.parseChannelRemoteAddr(channel));
response.setCode(ResponseCode.TOPIC_NOT_EXIST); response.setCode(ResponseCode.TOPIC_NOT_EXIST);
response.setRemark( response.setRemark(
"topic[" + requestHeader.getTopic() + "] not exist, apply first please!" + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL)); "topic[" + requestHeader.getTopic() + "] not exist, apply first please!" + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL));
return response; return response;
} }
if (!PermName.isReadable(topicConfig.getPerm())) { if (!PermName.isReadable(topicConfig.getPerm())) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("the topic[" + requestHeader.getTopic() + "] pulling message is forbidden"); response.setRemark("the topic[" + requestHeader.getTopic() + "] pulling message is forbidden");
return response; return response;
} }
if (requestHeader.getQueueId() < 0 || requestHeader.getQueueId() >= topicConfig.getReadQueueNums()) { if (requestHeader.getQueueId() < 0 || requestHeader.getQueueId() >= topicConfig.getReadQueueNums()) {
String errorInfo = "queueId[" + requestHeader.getQueueId() + "] is illagal,Topic :" + requestHeader.getTopic() String errorInfo = "queueId[" + requestHeader.getQueueId() + "] is illagal,Topic :" + requestHeader.getTopic()
+ " topicConfig.readQueueNums: " + topicConfig.getReadQueueNums() + " consumer: " + channel.remoteAddress(); + " topicConfig.readQueueNums: " + topicConfig.getReadQueueNums() + " consumer: " + channel.remoteAddress();
LOG.warn(errorInfo); LOG.warn(errorInfo);
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
response.setRemark(errorInfo); response.setRemark(errorInfo);
return response; return response;
} }
SubscriptionData subscriptionData = null; SubscriptionData subscriptionData = null;
if (hasSubscriptionFlag) { if (hasSubscriptionFlag) {
try { try {
subscriptionData = FilterAPI.buildSubscriptionData(requestHeader.getConsumerGroup(), requestHeader.getTopic(), subscriptionData = FilterAPI.buildSubscriptionData(requestHeader.getConsumerGroup(), requestHeader.getTopic(),
requestHeader.getSubscription()); requestHeader.getSubscription());
} catch (Exception e) { } catch (Exception e) {
LOG.warn("parse the consumer's subscription[{}] failed, group: {}", requestHeader.getSubscription(), // LOG.warn("parse the consumer's subscription[{}] failed, group: {}", requestHeader.getSubscription(), //
requestHeader.getConsumerGroup()); requestHeader.getConsumerGroup());
response.setCode(ResponseCode.SUBSCRIPTION_PARSE_FAILED); response.setCode(ResponseCode.SUBSCRIPTION_PARSE_FAILED);
response.setRemark("parse the consumer's subscription failed"); response.setRemark("parse the consumer's subscription failed");
return response; return response;
} }
} else { } else {
ConsumerGroupInfo consumerGroupInfo = ConsumerGroupInfo consumerGroupInfo =
this.brokerController.getConsumerManager().getConsumerGroupInfo(requestHeader.getConsumerGroup()); this.brokerController.getConsumerManager().getConsumerGroupInfo(requestHeader.getConsumerGroup());
if (null == consumerGroupInfo) { if (null == consumerGroupInfo) {
LOG.warn("the consumer's group info not exist, group: {}", requestHeader.getConsumerGroup()); LOG.warn("the consumer's group info not exist, group: {}", requestHeader.getConsumerGroup());
response.setCode(ResponseCode.SUBSCRIPTION_NOT_EXIST); response.setCode(ResponseCode.SUBSCRIPTION_NOT_EXIST);
...@@ -171,7 +165,7 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -171,7 +165,7 @@ public class PullMessageProcessor implements NettyRequestProcessor {
} }
if (!subscriptionGroupConfig.isConsumeBroadcastEnable() // if (!subscriptionGroupConfig.isConsumeBroadcastEnable() //
&& consumerGroupInfo.getMessageModel() == MessageModel.BROADCASTING) { && consumerGroupInfo.getMessageModel() == MessageModel.BROADCASTING) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("the consumer group[" + requestHeader.getConsumerGroup() + "] can not consume by broadcast way"); response.setRemark("the consumer group[" + requestHeader.getConsumerGroup() + "] can not consume by broadcast way");
return response; return response;
...@@ -185,10 +179,9 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -185,10 +179,9 @@ public class PullMessageProcessor implements NettyRequestProcessor {
return response; return response;
} }
if (subscriptionData.getSubVersion() < requestHeader.getSubVersion()) { if (subscriptionData.getSubVersion() < requestHeader.getSubVersion()) {
LOG.warn("the broker's subscription is not latest, group: {} {}", requestHeader.getConsumerGroup(), LOG.warn("the broker's subscription is not latest, group: {} {}", requestHeader.getConsumerGroup(),
subscriptionData.getSubString()); subscriptionData.getSubString());
response.setCode(ResponseCode.SUBSCRIPTION_NOT_LATEST); response.setCode(ResponseCode.SUBSCRIPTION_NOT_LATEST);
response.setRemark("the consumer's subscription not latest"); response.setRemark("the consumer's subscription not latest");
return response; return response;
...@@ -196,15 +189,14 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -196,15 +189,14 @@ public class PullMessageProcessor implements NettyRequestProcessor {
} }
final GetMessageResult getMessageResult = final GetMessageResult getMessageResult =
this.brokerController.getMessageStore().getMessage(requestHeader.getConsumerGroup(), requestHeader.getTopic(), this.brokerController.getMessageStore().getMessage(requestHeader.getConsumerGroup(), requestHeader.getTopic(),
requestHeader.getQueueId(), requestHeader.getQueueOffset(), requestHeader.getMaxMsgNums(), subscriptionData); requestHeader.getQueueId(), requestHeader.getQueueOffset(), requestHeader.getMaxMsgNums(), subscriptionData);
if (getMessageResult != null) { if (getMessageResult != null) {
response.setRemark(getMessageResult.getStatus().name()); response.setRemark(getMessageResult.getStatus().name());
responseHeader.setNextBeginOffset(getMessageResult.getNextBeginOffset()); responseHeader.setNextBeginOffset(getMessageResult.getNextBeginOffset());
responseHeader.setMinOffset(getMessageResult.getMinOffset()); responseHeader.setMinOffset(getMessageResult.getMinOffset());
responseHeader.setMaxOffset(getMessageResult.getMaxOffset()); responseHeader.setMaxOffset(getMessageResult.getMaxOffset());
if (getMessageResult.isSuggestPullingFromSlave()) { if (getMessageResult.isSuggestPullingFromSlave()) {
responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getWhichBrokerWhenConsumeSlowly()); responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getWhichBrokerWhenConsumeSlowly());
} else { } else {
...@@ -250,11 +242,11 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -250,11 +242,11 @@ public class PullMessageProcessor implements NettyRequestProcessor {
// XXX: warn and notify me // XXX: warn and notify me
LOG.info("the broker store no queue data, fix the request offset {} to {}, Topic: {} QueueId: {} Consumer Group: {}", // LOG.info("the broker store no queue data, fix the request offset {} to {}, Topic: {} QueueId: {} Consumer Group: {}", //
requestHeader.getQueueOffset(), // requestHeader.getQueueOffset(), //
getMessageResult.getNextBeginOffset(), // getMessageResult.getNextBeginOffset(), //
requestHeader.getTopic(), // requestHeader.getTopic(), //
requestHeader.getQueueId(), // requestHeader.getQueueId(), //
requestHeader.getConsumerGroup()// requestHeader.getConsumerGroup()//
); );
} else { } else {
response.setCode(ResponseCode.PULL_NOT_FOUND); response.setCode(ResponseCode.PULL_NOT_FOUND);
...@@ -270,7 +262,7 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -270,7 +262,7 @@ public class PullMessageProcessor implements NettyRequestProcessor {
response.setCode(ResponseCode.PULL_OFFSET_MOVED); response.setCode(ResponseCode.PULL_OFFSET_MOVED);
// XXX: warn and notify me // XXX: warn and notify me
LOG.info("the request offset: " + requestHeader.getQueueOffset() + " over flow badly, broker max offset: " LOG.info("the request offset: " + requestHeader.getQueueOffset() + " over flow badly, broker max offset: "
+ getMessageResult.getMaxOffset() + ", consumer: " + channel.remoteAddress()); + getMessageResult.getMaxOffset() + ", consumer: " + channel.remoteAddress());
break; break;
case OFFSET_OVERFLOW_ONE: case OFFSET_OVERFLOW_ONE:
response.setCode(ResponseCode.PULL_NOT_FOUND); response.setCode(ResponseCode.PULL_NOT_FOUND);
...@@ -278,8 +270,8 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -278,8 +270,8 @@ public class PullMessageProcessor implements NettyRequestProcessor {
case OFFSET_TOO_SMALL: case OFFSET_TOO_SMALL:
response.setCode(ResponseCode.PULL_OFFSET_MOVED); response.setCode(ResponseCode.PULL_OFFSET_MOVED);
LOG.info("the request offset too small. group={}, topic={}, requestOffset={}, brokerMinOffset={}, clientIp={}", LOG.info("the request offset too small. group={}, topic={}, requestOffset={}, brokerMinOffset={}, clientIp={}",
requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueOffset(), requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueOffset(),
getMessageResult.getMinOffset(), channel.remoteAddress()); getMessageResult.getMinOffset(), channel.remoteAddress());
break; break;
default: default:
assert false; assert false;
...@@ -308,7 +300,6 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -308,7 +300,6 @@ public class PullMessageProcessor implements NettyRequestProcessor {
case ResponseCode.PULL_NOT_FOUND: case ResponseCode.PULL_NOT_FOUND:
if (!brokerAllowSuspend) { if (!brokerAllowSuspend) {
context.setCommercialRcvStats(BrokerStatsManager.StatsType.RCV_EPOLLS); context.setCommercialRcvStats(BrokerStatsManager.StatsType.RCV_EPOLLS);
context.setCommercialRcvTimes(1); context.setCommercialRcvTimes(1);
context.setCommercialOwner(owner); context.setCommercialOwner(owner);
...@@ -333,23 +324,23 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -333,23 +324,23 @@ public class PullMessageProcessor implements NettyRequestProcessor {
case ResponseCode.SUCCESS: case ResponseCode.SUCCESS:
this.brokerController.getBrokerStatsManager().incGroupGetNums(requestHeader.getConsumerGroup(), requestHeader.getTopic(), this.brokerController.getBrokerStatsManager().incGroupGetNums(requestHeader.getConsumerGroup(), requestHeader.getTopic(),
getMessageResult.getMessageCount()); getMessageResult.getMessageCount());
this.brokerController.getBrokerStatsManager().incGroupGetSize(requestHeader.getConsumerGroup(), requestHeader.getTopic(), this.brokerController.getBrokerStatsManager().incGroupGetSize(requestHeader.getConsumerGroup(), requestHeader.getTopic(),
getMessageResult.getBufferTotalSize()); getMessageResult.getBufferTotalSize());
this.brokerController.getBrokerStatsManager().incBrokerGetNums(getMessageResult.getMessageCount()); this.brokerController.getBrokerStatsManager().incBrokerGetNums(getMessageResult.getMessageCount());
if (this.brokerController.getBrokerConfig().isTransferMsgByHeap()) { if (this.brokerController.getBrokerConfig().isTransferMsgByHeap()) {
final long beginTimeMills = this.brokerController.getMessageStore().now(); final long beginTimeMills = this.brokerController.getMessageStore().now();
final byte[] r = this.readGetMessageResult(getMessageResult, requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId()); final byte[] r = this.readGetMessageResult(getMessageResult, requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId());
this.brokerController.getBrokerStatsManager().incGroupGetLatency(requestHeader.getConsumerGroup(), this.brokerController.getBrokerStatsManager().incGroupGetLatency(requestHeader.getConsumerGroup(),
requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getTopic(), requestHeader.getQueueId(),
(int) (this.brokerController.getMessageStore().now() - beginTimeMills)); (int)(this.brokerController.getMessageStore().now() - beginTimeMills));
response.setBody(r); response.setBody(r);
} else { } else {
try { try {
FileRegion fileRegion = FileRegion fileRegion =
new ManyMessageTransfer(response.encodeHeader(getMessageResult.getBufferTotalSize()), getMessageResult); new ManyMessageTransfer(response.encodeHeader(getMessageResult.getBufferTotalSize()), getMessageResult);
channel.writeAndFlush(fileRegion).addListener(new ChannelFutureListener() { channel.writeAndFlush(fileRegion).addListener(new ChannelFutureListener() {
@Override @Override
public void operationComplete(ChannelFuture future) throws Exception { public void operationComplete(ChannelFuture future) throws Exception {
...@@ -379,18 +370,17 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -379,18 +370,17 @@ public class PullMessageProcessor implements NettyRequestProcessor {
long offset = requestHeader.getQueueOffset(); long offset = requestHeader.getQueueOffset();
int queueId = requestHeader.getQueueId(); int queueId = requestHeader.getQueueId();
PullRequest pullRequest = new PullRequest(request, channel, pollingTimeMills, PullRequest pullRequest = new PullRequest(request, channel, pollingTimeMills,
this.brokerController.getMessageStore().now(), offset, subscriptionData); this.brokerController.getMessageStore().now(), offset, subscriptionData);
this.brokerController.getPullRequestHoldService().suspendPullRequest(topic, queueId, pullRequest); this.brokerController.getPullRequestHoldService().suspendPullRequest(topic, queueId, pullRequest);
response = null; response = null;
break; break;
} }
case ResponseCode.PULL_RETRY_IMMEDIATELY: case ResponseCode.PULL_RETRY_IMMEDIATELY:
break; break;
case ResponseCode.PULL_OFFSET_MOVED: case ResponseCode.PULL_OFFSET_MOVED:
if (this.brokerController.getMessageStoreConfig().getBrokerRole() != BrokerRole.SLAVE if (this.brokerController.getMessageStoreConfig().getBrokerRole() != BrokerRole.SLAVE
|| this.brokerController.getMessageStoreConfig().isOffsetCheckInSlave()) { || this.brokerController.getMessageStoreConfig().isOffsetCheckInSlave()) {
MessageQueue mq = new MessageQueue(); MessageQueue mq = new MessageQueue();
mq.setTopic(requestHeader.getTopic()); mq.setTopic(requestHeader.getTopic());
mq.setQueueId(requestHeader.getQueueId()); mq.setQueueId(requestHeader.getQueueId());
...@@ -403,15 +393,15 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -403,15 +393,15 @@ public class PullMessageProcessor implements NettyRequestProcessor {
event.setOffsetNew(getMessageResult.getNextBeginOffset()); event.setOffsetNew(getMessageResult.getNextBeginOffset());
this.generateOffsetMovedEvent(event); this.generateOffsetMovedEvent(event);
LOG.warn( LOG.warn(
"PULL_OFFSET_MOVED:correction offset. topic={}, groupId={}, requestOffset={}, newOffset={}, suggestBrokerId={}", "PULL_OFFSET_MOVED:correction offset. topic={}, groupId={}, requestOffset={}, newOffset={}, suggestBrokerId={}",
requestHeader.getTopic(), requestHeader.getConsumerGroup(), event.getOffsetRequest(), event.getOffsetNew(), requestHeader.getTopic(), requestHeader.getConsumerGroup(), event.getOffsetRequest(), event.getOffsetNew(),
responseHeader.getSuggestWhichBrokerId()); responseHeader.getSuggestWhichBrokerId());
} else { } else {
responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getBrokerId()); responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getBrokerId());
response.setCode(ResponseCode.PULL_RETRY_IMMEDIATELY); response.setCode(ResponseCode.PULL_RETRY_IMMEDIATELY);
LOG.warn("PULL_OFFSET_MOVED:none correction. topic={}, groupId={}, requestOffset={}, suggestBrokerId={}", LOG.warn("PULL_OFFSET_MOVED:none correction. topic={}, groupId={}, requestOffset={}, suggestBrokerId={}",
requestHeader.getTopic(), requestHeader.getConsumerGroup(), requestHeader.getQueueOffset(), requestHeader.getTopic(), requestHeader.getConsumerGroup(), requestHeader.getQueueOffset(),
responseHeader.getSuggestWhichBrokerId()); responseHeader.getSuggestWhichBrokerId());
} }
break; break;
...@@ -423,19 +413,17 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -423,19 +413,17 @@ public class PullMessageProcessor implements NettyRequestProcessor {
response.setRemark("store getMessage return null"); response.setRemark("store getMessage return null");
} }
boolean storeOffsetEnable = brokerAllowSuspend; boolean storeOffsetEnable = brokerAllowSuspend;
storeOffsetEnable = storeOffsetEnable && hasCommitOffsetFlag; storeOffsetEnable = storeOffsetEnable && hasCommitOffsetFlag;
storeOffsetEnable = storeOffsetEnable storeOffsetEnable = storeOffsetEnable
&& this.brokerController.getMessageStoreConfig().getBrokerRole() != BrokerRole.SLAVE; && this.brokerController.getMessageStoreConfig().getBrokerRole() != BrokerRole.SLAVE;
if (storeOffsetEnable) { if (storeOffsetEnable) {
this.brokerController.getConsumerOffsetManager().commitOffset(RemotingHelper.parseChannelRemoteAddr(channel), this.brokerController.getConsumerOffsetManager().commitOffset(RemotingHelper.parseChannelRemoteAddr(channel),
requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getCommitOffset()); requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getCommitOffset());
} }
return response; return response;
} }
public boolean hasConsumeMessageHook() { public boolean hasConsumeMessageHook() {
return consumeMessageHookList != null && !this.consumeMessageHookList.isEmpty(); return consumeMessageHookList != null && !this.consumeMessageHookList.isEmpty();
} }
...@@ -512,7 +500,7 @@ public class PullMessageProcessor implements NettyRequestProcessor { ...@@ -512,7 +500,7 @@ public class PullMessageProcessor implements NettyRequestProcessor {
public void operationComplete(ChannelFuture future) throws Exception { public void operationComplete(ChannelFuture future) throws Exception {
if (!future.isSuccess()) { if (!future.isSuccess()) {
LOG.error("processRequestWrapper response to " + future.channel().remoteAddress() + " failed", LOG.error("processRequestWrapper response to " + future.channel().remoteAddress() + " failed",
future.cause()); future.cause());
LOG.error(request.toString()); LOG.error(request.toString());
LOG.error(response.toString()); LOG.error(response.toString());
} }
......
...@@ -6,16 +6,20 @@ ...@@ -6,16 +6,20 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.FileRegion;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.pagecache.OneMessageTransfer; import org.apache.rocketmq.broker.pagecache.OneMessageTransfer;
import org.apache.rocketmq.broker.pagecache.QueryMessageTransfer; import org.apache.rocketmq.broker.pagecache.QueryMessageTransfer;
...@@ -31,28 +35,21 @@ import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; ...@@ -31,28 +35,21 @@ import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.store.QueryMessageResult; import org.apache.rocketmq.store.QueryMessageResult;
import org.apache.rocketmq.store.SelectMappedBufferResult; import org.apache.rocketmq.store.SelectMappedBufferResult;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.FileRegion;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class QueryMessageProcessor implements NettyRequestProcessor { public class QueryMessageProcessor implements NettyRequestProcessor {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final BrokerController brokerController; private final BrokerController brokerController;
public QueryMessageProcessor(final BrokerController brokerController) { public QueryMessageProcessor(final BrokerController brokerController) {
this.brokerController = brokerController; this.brokerController = brokerController;
} }
@Override @Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
switch (request.getCode()) { switch (request.getCode()) {
case RequestCode.QUERY_MESSAGE: case RequestCode.QUERY_MESSAGE:
return this.queryMessage(ctx, request); return this.queryMessage(ctx, request);
...@@ -70,44 +67,40 @@ public class QueryMessageProcessor implements NettyRequestProcessor { ...@@ -70,44 +67,40 @@ public class QueryMessageProcessor implements NettyRequestProcessor {
return false; return false;
} }
public RemotingCommand queryMessage(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand queryMessage(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = final RemotingCommand response =
RemotingCommand.createResponseCommand(QueryMessageResponseHeader.class); RemotingCommand.createResponseCommand(QueryMessageResponseHeader.class);
final QueryMessageResponseHeader responseHeader = final QueryMessageResponseHeader responseHeader =
(QueryMessageResponseHeader) response.readCustomHeader(); (QueryMessageResponseHeader)response.readCustomHeader();
final QueryMessageRequestHeader requestHeader = final QueryMessageRequestHeader requestHeader =
(QueryMessageRequestHeader) request (QueryMessageRequestHeader)request
.decodeCommandCustomHeader(QueryMessageRequestHeader.class); .decodeCommandCustomHeader(QueryMessageRequestHeader.class);
response.setOpaque(request.getOpaque()); response.setOpaque(request.getOpaque());
String isUniqueKey = request.getExtFields().get(MixAll.UNIQUE_MSG_QUERY_FLAG); String isUniqueKey = request.getExtFields().get(MixAll.UNIQUE_MSG_QUERY_FLAG);
if (isUniqueKey != null && isUniqueKey.equals("true")) { if (isUniqueKey != null && isUniqueKey.equals("true")) {
requestHeader.setMaxNum(this.brokerController.getMessageStoreConfig().getDefaultQueryMaxNum()); requestHeader.setMaxNum(this.brokerController.getMessageStoreConfig().getDefaultQueryMaxNum());
} }
final QueryMessageResult queryMessageResult = final QueryMessageResult queryMessageResult =
this.brokerController.getMessageStore().queryMessage(requestHeader.getTopic(), this.brokerController.getMessageStore().queryMessage(requestHeader.getTopic(),
requestHeader.getKey(), requestHeader.getMaxNum(), requestHeader.getBeginTimestamp(), requestHeader.getKey(), requestHeader.getMaxNum(), requestHeader.getBeginTimestamp(),
requestHeader.getEndTimestamp()); requestHeader.getEndTimestamp());
assert queryMessageResult != null; assert queryMessageResult != null;
responseHeader.setIndexLastUpdatePhyoffset(queryMessageResult.getIndexLastUpdatePhyoffset()); responseHeader.setIndexLastUpdatePhyoffset(queryMessageResult.getIndexLastUpdatePhyoffset());
responseHeader.setIndexLastUpdateTimestamp(queryMessageResult.getIndexLastUpdateTimestamp()); responseHeader.setIndexLastUpdateTimestamp(queryMessageResult.getIndexLastUpdateTimestamp());
if (queryMessageResult.getBufferTotalSize() > 0) { if (queryMessageResult.getBufferTotalSize() > 0) {
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
try { try {
FileRegion fileRegion = FileRegion fileRegion =
new QueryMessageTransfer(response.encodeHeader(queryMessageResult new QueryMessageTransfer(response.encodeHeader(queryMessageResult
.getBufferTotalSize()), queryMessageResult); .getBufferTotalSize()), queryMessageResult);
ctx.channel().writeAndFlush(fileRegion).addListener(new ChannelFutureListener() { ctx.channel().writeAndFlush(fileRegion).addListener(new ChannelFutureListener() {
@Override @Override
public void operationComplete(ChannelFuture future) throws Exception { public void operationComplete(ChannelFuture future) throws Exception {
...@@ -130,26 +123,24 @@ public class QueryMessageProcessor implements NettyRequestProcessor { ...@@ -130,26 +123,24 @@ public class QueryMessageProcessor implements NettyRequestProcessor {
return response; return response;
} }
public RemotingCommand viewMessageById(ChannelHandlerContext ctx, RemotingCommand request) public RemotingCommand viewMessageById(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null); final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final ViewMessageRequestHeader requestHeader = final ViewMessageRequestHeader requestHeader =
(ViewMessageRequestHeader) request.decodeCommandCustomHeader(ViewMessageRequestHeader.class); (ViewMessageRequestHeader)request.decodeCommandCustomHeader(ViewMessageRequestHeader.class);
response.setOpaque(request.getOpaque()); response.setOpaque(request.getOpaque());
final SelectMappedBufferResult selectMappedBufferResult = final SelectMappedBufferResult selectMappedBufferResult =
this.brokerController.getMessageStore().selectOneMessageByOffset(requestHeader.getOffset()); this.brokerController.getMessageStore().selectOneMessageByOffset(requestHeader.getOffset());
if (selectMappedBufferResult != null) { if (selectMappedBufferResult != null) {
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
try { try {
FileRegion fileRegion = FileRegion fileRegion =
new OneMessageTransfer(response.encodeHeader(selectMappedBufferResult.getSize()), new OneMessageTransfer(response.encodeHeader(selectMappedBufferResult.getSize()),
selectMappedBufferResult); selectMappedBufferResult);
ctx.channel().writeAndFlush(fileRegion).addListener(new ChannelFutureListener() { ctx.channel().writeAndFlush(fileRegion).addListener(new ChannelFutureListener() {
@Override @Override
public void operationComplete(ChannelFuture future) throws Exception { public void operationComplete(ChannelFuture future) throws Exception {
......
...@@ -17,11 +17,17 @@ ...@@ -17,11 +17,17 @@
package org.apache.rocketmq.broker.processor; package org.apache.rocketmq.broker.processor;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import java.net.SocketAddress;
import java.util.List;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.mqtrace.ConsumeMessageContext; import org.apache.rocketmq.broker.mqtrace.ConsumeMessageContext;
import org.apache.rocketmq.broker.mqtrace.ConsumeMessageHook; import org.apache.rocketmq.broker.mqtrace.ConsumeMessageHook;
import org.apache.rocketmq.broker.mqtrace.SendMessageContext; import org.apache.rocketmq.broker.mqtrace.SendMessageContext;
import org.apache.rocketmq.common.*; import org.apache.rocketmq.common.MQVersion;
import org.apache.rocketmq.common.MixAll;
import org.apache.rocketmq.common.TopicConfig;
import org.apache.rocketmq.common.TopicFilterType;
import org.apache.rocketmq.common.UtilAll;
import org.apache.rocketmq.common.constant.PermName; import org.apache.rocketmq.common.constant.PermName;
import org.apache.rocketmq.common.help.FAQUrl; import org.apache.rocketmq.common.help.FAQUrl;
import org.apache.rocketmq.common.message.MessageAccessor; import org.apache.rocketmq.common.message.MessageAccessor;
...@@ -44,10 +50,6 @@ import org.apache.rocketmq.store.PutMessageResult; ...@@ -44,10 +50,6 @@ import org.apache.rocketmq.store.PutMessageResult;
import org.apache.rocketmq.store.config.StorePathConfigHelper; import org.apache.rocketmq.store.config.StorePathConfigHelper;
import org.apache.rocketmq.store.stats.BrokerStatsManager; import org.apache.rocketmq.store.stats.BrokerStatsManager;
import java.net.SocketAddress;
import java.util.List;
public class SendMessageProcessor extends AbstractSendMessageProcessor implements NettyRequestProcessor { public class SendMessageProcessor extends AbstractSendMessageProcessor implements NettyRequestProcessor {
private List<ConsumeMessageHook> consumeMessageHookList; private List<ConsumeMessageHook> consumeMessageHookList;
...@@ -80,14 +82,14 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -80,14 +82,14 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
@Override @Override
public boolean rejectRequest() { public boolean rejectRequest() {
return this.brokerController.getMessageStore().isOSPageCacheBusy() || return this.brokerController.getMessageStore().isOSPageCacheBusy() ||
this.brokerController.getMessageStore().isTransientStorePoolDeficient(); this.brokerController.getMessageStore().isTransientStorePoolDeficient();
} }
private RemotingCommand consumerSendMsgBack(final ChannelHandlerContext ctx, final RemotingCommand request) private RemotingCommand consumerSendMsgBack(final ChannelHandlerContext ctx, final RemotingCommand request)
throws RemotingCommandException { throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null); final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final ConsumerSendMsgBackRequestHeader requestHeader = final ConsumerSendMsgBackRequestHeader requestHeader =
(ConsumerSendMsgBackRequestHeader) request.decodeCommandCustomHeader(ConsumerSendMsgBackRequestHeader.class); (ConsumerSendMsgBackRequestHeader)request.decodeCommandCustomHeader(ConsumerSendMsgBackRequestHeader.class);
if (this.hasConsumeMessageHook() && !UtilAll.isBlank(requestHeader.getOriginMsgId())) { if (this.hasConsumeMessageHook() && !UtilAll.isBlank(requestHeader.getOriginMsgId())) {
...@@ -101,24 +103,21 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -101,24 +103,21 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
this.executeConsumeMessageHookAfter(context); this.executeConsumeMessageHookAfter(context);
} }
SubscriptionGroupConfig subscriptionGroupConfig = SubscriptionGroupConfig subscriptionGroupConfig =
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(requestHeader.getGroup()); this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(requestHeader.getGroup());
if (null == subscriptionGroupConfig) { if (null == subscriptionGroupConfig) {
response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST); response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST);
response.setRemark("subscription group not exist, " + requestHeader.getGroup() + " " response.setRemark("subscription group not exist, " + requestHeader.getGroup() + " "
+ FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST)); + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST));
return response; return response;
} }
if (!PermName.isWriteable(this.brokerController.getBrokerConfig().getBrokerPermission())) { if (!PermName.isWriteable(this.brokerController.getBrokerConfig().getBrokerPermission())) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] sending message is forbidden"); response.setRemark("the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] sending message is forbidden");
return response; return response;
} }
if (subscriptionGroupConfig.getRetryQueueNums() <= 0) { if (subscriptionGroupConfig.getRetryQueueNums() <= 0) {
response.setCode(ResponseCode.SUCCESS); response.setCode(ResponseCode.SUCCESS);
response.setRemark(null); response.setRemark(null);
...@@ -128,24 +127,21 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -128,24 +127,21 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
String newTopic = MixAll.getRetryTopic(requestHeader.getGroup()); String newTopic = MixAll.getRetryTopic(requestHeader.getGroup());
int queueIdInt = Math.abs(this.random.nextInt() % 99999999) % subscriptionGroupConfig.getRetryQueueNums(); int queueIdInt = Math.abs(this.random.nextInt() % 99999999) % subscriptionGroupConfig.getRetryQueueNums();
int topicSysFlag = 0; int topicSysFlag = 0;
if (requestHeader.isUnitMode()) { if (requestHeader.isUnitMode()) {
topicSysFlag = TopicSysFlag.buildSysFlag(false, true); topicSysFlag = TopicSysFlag.buildSysFlag(false, true);
} }
TopicConfig topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(// TopicConfig topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(//
newTopic, // newTopic, //
subscriptionGroupConfig.getRetryQueueNums(), // subscriptionGroupConfig.getRetryQueueNums(), //
PermName.PERM_WRITE | PermName.PERM_READ, topicSysFlag); PermName.PERM_WRITE | PermName.PERM_READ, topicSysFlag);
if (null == topicConfig) { if (null == topicConfig) {
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
response.setRemark("topic[" + newTopic + "] not exist"); response.setRemark("topic[" + newTopic + "] not exist");
return response; return response;
} }
if (!PermName.isWriteable(topicConfig.getPerm())) { if (!PermName.isWriteable(topicConfig.getPerm())) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark(String.format("the topic[%s] sending message is forbidden", newTopic)); response.setRemark(String.format("the topic[%s] sending message is forbidden", newTopic));
...@@ -159,31 +155,27 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -159,31 +155,27 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
return response; return response;
} }
final String retryTopic = msgExt.getProperty(MessageConst.PROPERTY_RETRY_TOPIC); final String retryTopic = msgExt.getProperty(MessageConst.PROPERTY_RETRY_TOPIC);
if (null == retryTopic) { if (null == retryTopic) {
MessageAccessor.putProperty(msgExt, MessageConst.PROPERTY_RETRY_TOPIC, msgExt.getTopic()); MessageAccessor.putProperty(msgExt, MessageConst.PROPERTY_RETRY_TOPIC, msgExt.getTopic());
} }
msgExt.setWaitStoreMsgOK(false); msgExt.setWaitStoreMsgOK(false);
int delayLevel = requestHeader.getDelayLevel(); int delayLevel = requestHeader.getDelayLevel();
int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes(); int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes();
if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) { if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) {
maxReconsumeTimes = requestHeader.getMaxReconsumeTimes(); maxReconsumeTimes = requestHeader.getMaxReconsumeTimes();
} }
if (msgExt.getReconsumeTimes() >= maxReconsumeTimes// if (msgExt.getReconsumeTimes() >= maxReconsumeTimes//
|| delayLevel < 0) { || delayLevel < 0) {
newTopic = MixAll.getDLQTopic(requestHeader.getGroup()); newTopic = MixAll.getDLQTopic(requestHeader.getGroup());
queueIdInt = Math.abs(this.random.nextInt() % 99999999) % DLQ_NUMS_PER_GROUP; queueIdInt = Math.abs(this.random.nextInt() % 99999999) % DLQ_NUMS_PER_GROUP;
topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic, // topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic, //
DLQ_NUMS_PER_GROUP, // DLQ_NUMS_PER_GROUP, //
PermName.PERM_WRITE, 0 PermName.PERM_WRITE, 0
); );
if (null == topicConfig) { if (null == topicConfig) {
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
...@@ -247,13 +239,12 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -247,13 +239,12 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
} }
private RemotingCommand sendMessage(final ChannelHandlerContext ctx, // private RemotingCommand sendMessage(final ChannelHandlerContext ctx, //
final RemotingCommand request, // final RemotingCommand request, //
final SendMessageContext sendMessageContext, // final SendMessageContext sendMessageContext, //
final SendMessageRequestHeader requestHeader) throws RemotingCommandException { final SendMessageRequestHeader requestHeader) throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class); final RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class);
final SendMessageResponseHeader responseHeader = (SendMessageResponseHeader) response.readCustomHeader(); final SendMessageResponseHeader responseHeader = (SendMessageResponseHeader)response.readCustomHeader();
response.setOpaque(request.getOpaque()); response.setOpaque(request.getOpaque());
...@@ -296,15 +287,14 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -296,15 +287,14 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
if (null != newTopic && newTopic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) { if (null != newTopic && newTopic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) {
String groupName = newTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length()); String groupName = newTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length());
SubscriptionGroupConfig subscriptionGroupConfig = SubscriptionGroupConfig subscriptionGroupConfig =
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(groupName); this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(groupName);
if (null == subscriptionGroupConfig) { if (null == subscriptionGroupConfig) {
response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST); response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST);
response.setRemark( response.setRemark(
"subscription group not exist, " + groupName + " " + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST)); "subscription group not exist, " + groupName + " " + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST));
return response; return response;
} }
int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes(); int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes();
if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) { if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) {
maxReconsumeTimes = requestHeader.getMaxReconsumeTimes(); maxReconsumeTimes = requestHeader.getMaxReconsumeTimes();
...@@ -314,8 +304,8 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -314,8 +304,8 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
newTopic = MixAll.getDLQTopic(groupName); newTopic = MixAll.getDLQTopic(groupName);
queueIdInt = Math.abs(this.random.nextInt() % 99999999) % DLQ_NUMS_PER_GROUP; queueIdInt = Math.abs(this.random.nextInt() % 99999999) % DLQ_NUMS_PER_GROUP;
topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic, // topicConfig = this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic, //
DLQ_NUMS_PER_GROUP, // DLQ_NUMS_PER_GROUP, //
PermName.PERM_WRITE, 0 PermName.PERM_WRITE, 0
); );
if (null == topicConfig) { if (null == topicConfig) {
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
...@@ -344,7 +334,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -344,7 +334,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
if (traFlag != null) { if (traFlag != null) {
response.setCode(ResponseCode.NO_PERMISSION); response.setCode(ResponseCode.NO_PERMISSION);
response.setRemark( response.setRemark(
"the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] sending transaction message is forbidden"); "the broker[" + this.brokerController.getBrokerConfig().getBrokerIP1() + "] sending transaction message is forbidden");
return response; return response;
} }
} }
...@@ -381,12 +371,12 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -381,12 +371,12 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
case PROPERTIES_SIZE_EXCEEDED: case PROPERTIES_SIZE_EXCEEDED:
response.setCode(ResponseCode.MESSAGE_ILLEGAL); response.setCode(ResponseCode.MESSAGE_ILLEGAL);
response.setRemark( response.setRemark(
"the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k."); "the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k.");
break; break;
case SERVICE_NOT_AVAILABLE: case SERVICE_NOT_AVAILABLE:
response.setCode(ResponseCode.SERVICE_NOT_AVAILABLE); response.setCode(ResponseCode.SERVICE_NOT_AVAILABLE);
response.setRemark( response.setRemark(
"service not available now, maybe disk full, " + diskUtil() + ", maybe your broker machine memory too small."); "service not available now, maybe disk full, " + diskUtil() + ", maybe your broker machine memory too small.");
break; break;
case OS_PAGECACHE_BUSY: case OS_PAGECACHE_BUSY:
response.setCode(ResponseCode.SYSTEM_ERROR); response.setCode(ResponseCode.SYSTEM_ERROR);
...@@ -407,7 +397,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -407,7 +397,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
this.brokerController.getBrokerStatsManager().incTopicPutNums(msgInner.getTopic()); this.brokerController.getBrokerStatsManager().incTopicPutNums(msgInner.getTopic());
this.brokerController.getBrokerStatsManager().incTopicPutSize(msgInner.getTopic(), this.brokerController.getBrokerStatsManager().incTopicPutSize(msgInner.getTopic(),
putMessageResult.getAppendMessageResult().getWroteBytes()); putMessageResult.getAppendMessageResult().getWroteBytes());
this.brokerController.getBrokerStatsManager().incBrokerPutNums(); this.brokerController.getBrokerStatsManager().incBrokerPutNums();
response.setRemark(null); response.setRemark(null);
...@@ -416,10 +406,8 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -416,10 +406,8 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
responseHeader.setQueueId(queueIdInt); responseHeader.setQueueId(queueIdInt);
responseHeader.setQueueOffset(putMessageResult.getAppendMessageResult().getLogicsOffset()); responseHeader.setQueueOffset(putMessageResult.getAppendMessageResult().getLogicsOffset());
doResponse(ctx, request, response); doResponse(ctx, request, response);
if (hasSendMessageHook()) { if (hasSendMessageHook()) {
sendMessageContext.setMsgId(responseHeader.getMsgId()); sendMessageContext.setMsgId(responseHeader.getMsgId());
sendMessageContext.setQueueId(responseHeader.getQueueId()); sendMessageContext.setQueueId(responseHeader.getQueueId());
...@@ -427,7 +415,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -427,7 +415,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
int commercialBaseCount = brokerController.getBrokerConfig().getCommercialBaseCount(); int commercialBaseCount = brokerController.getBrokerConfig().getCommercialBaseCount();
int wroteSize = putMessageResult.getAppendMessageResult().getWroteBytes(); int wroteSize = putMessageResult.getAppendMessageResult().getWroteBytes();
int incValue = (int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT) * commercialBaseCount; int incValue = (int)Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT) * commercialBaseCount;
sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_SUCCESS); sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_SUCCESS);
sendMessageContext.setCommercialSendTimes(incValue); sendMessageContext.setCommercialSendTimes(incValue);
...@@ -438,7 +426,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -438,7 +426,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
} else { } else {
if (hasSendMessageHook()) { if (hasSendMessageHook()) {
int wroteSize = request.getBody().length; int wroteSize = request.getBody().length;
int incValue = (int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT); int incValue = (int)Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT);
sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_FAILURE); sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_FAILURE);
sendMessageContext.setCommercialSendTimes(incValue); sendMessageContext.setCommercialSendTimes(incValue);
...@@ -479,11 +467,11 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement ...@@ -479,11 +467,11 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
double physicRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathPhysic); double physicRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathPhysic);
String storePathLogis = String storePathLogis =
StorePathConfigHelper.getStorePathConsumeQueue(this.brokerController.getMessageStoreConfig().getStorePathRootDir()); StorePathConfigHelper.getStorePathConsumeQueue(this.brokerController.getMessageStoreConfig().getStorePathRootDir());
double logisRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathLogis); double logisRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathLogis);
String storePathIndex = String storePathIndex =
StorePathConfigHelper.getStorePathIndex(this.brokerController.getMessageStoreConfig().getStorePathRootDir()); StorePathConfigHelper.getStorePathIndex(this.brokerController.getMessageStoreConfig().getStorePathRootDir());
double indexRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathIndex); double indexRatio = UtilAll.getDiskPartitionSpaceUsedPercent(storePathIndex);
return String.format("CL: %5.2f CQ: %5.2f INDEX: %5.2f", physicRatio, logisRatio, indexRatio); return String.format("CL: %5.2f CQ: %5.2f INDEX: %5.2f", physicRatio, logisRatio, indexRatio);
......
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
*/ */
package org.apache.rocketmq.broker.subscription; package org.apache.rocketmq.broker.subscription;
import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.BrokerController;
import org.apache.rocketmq.broker.BrokerPathConfigHelper; import org.apache.rocketmq.broker.BrokerPathConfigHelper;
import org.apache.rocketmq.common.ConfigManager; import org.apache.rocketmq.common.ConfigManager;
...@@ -27,25 +31,23 @@ import org.apache.rocketmq.remoting.protocol.RemotingSerializable; ...@@ -27,25 +31,23 @@ import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
public class SubscriptionGroupManager extends ConfigManager { public class SubscriptionGroupManager extends ConfigManager {
private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
private final ConcurrentHashMap<String, SubscriptionGroupConfig> subscriptionGroupTable = private final ConcurrentHashMap<String, SubscriptionGroupConfig> subscriptionGroupTable =
new ConcurrentHashMap<String, SubscriptionGroupConfig>(1024); new ConcurrentHashMap<String, SubscriptionGroupConfig>(1024);
private final DataVersion dataVersion = new DataVersion(); private final DataVersion dataVersion = new DataVersion();
private transient BrokerController brokerController; private transient BrokerController brokerController;
public SubscriptionGroupManager() { public SubscriptionGroupManager() {
this.init(); this.init();
} }
public SubscriptionGroupManager(BrokerController brokerController) {
this.brokerController = brokerController;
this.init();
}
private void init() { private void init() {
{ {
SubscriptionGroupConfig subscriptionGroupConfig = new SubscriptionGroupConfig(); SubscriptionGroupConfig subscriptionGroupConfig = new SubscriptionGroupConfig();
...@@ -94,13 +96,6 @@ public class SubscriptionGroupManager extends ConfigManager { ...@@ -94,13 +96,6 @@ public class SubscriptionGroupManager extends ConfigManager {
} }
} }
public SubscriptionGroupManager(BrokerController brokerController) {
this.brokerController = brokerController;
this.init();
}
public void updateSubscriptionGroupConfig(final SubscriptionGroupConfig config) { public void updateSubscriptionGroupConfig(final SubscriptionGroupConfig config) {
SubscriptionGroupConfig old = this.subscriptionGroupTable.put(config.getGroupName(), config); SubscriptionGroupConfig old = this.subscriptionGroupTable.put(config.getGroupName(), config);
if (old != null) { if (old != null) {
...@@ -122,7 +117,6 @@ public class SubscriptionGroupManager extends ConfigManager { ...@@ -122,7 +117,6 @@ public class SubscriptionGroupManager extends ConfigManager {
} }
} }
public SubscriptionGroupConfig findSubscriptionGroupConfig(final String group) { public SubscriptionGroupConfig findSubscriptionGroupConfig(final String group) {
SubscriptionGroupConfig subscriptionGroupConfig = this.subscriptionGroupTable.get(group); SubscriptionGroupConfig subscriptionGroupConfig = this.subscriptionGroupTable.get(group);
if (null == subscriptionGroupConfig) { if (null == subscriptionGroupConfig) {
...@@ -141,7 +135,6 @@ public class SubscriptionGroupManager extends ConfigManager { ...@@ -141,7 +135,6 @@ public class SubscriptionGroupManager extends ConfigManager {
return subscriptionGroupConfig; return subscriptionGroupConfig;
} }
@Override @Override
public String encode() { public String encode() {
return this.encode(false); return this.encode(false);
...@@ -181,12 +174,10 @@ public class SubscriptionGroupManager extends ConfigManager { ...@@ -181,12 +174,10 @@ public class SubscriptionGroupManager extends ConfigManager {
return subscriptionGroupTable; return subscriptionGroupTable;
} }
public DataVersion getDataVersion() { public DataVersion getDataVersion() {
return dataVersion; return dataVersion;
} }
public void deleteSubscriptionGroupConfig(final String groupName) { public void deleteSubscriptionGroupConfig(final String groupName) {
SubscriptionGroupConfig old = this.subscriptionGroupTable.remove(groupName); SubscriptionGroupConfig old = this.subscriptionGroupTable.remove(groupName);
if (old != null) { if (old != null) {
......
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.rocketmq.broker.transaction; package org.apache.rocketmq.broker.transaction;
...@@ -22,22 +22,18 @@ public class TransactionRecord { ...@@ -22,22 +22,18 @@ public class TransactionRecord {
private long offset; private long offset;
private String producerGroup; private String producerGroup;
public long getOffset() { public long getOffset() {
return offset; return offset;
} }
public void setOffset(long offset) { public void setOffset(long offset) {
this.offset = offset; this.offset = offset;
} }
public String getProducerGroup() { public String getProducerGroup() {
return producerGroup; return producerGroup;
} }
public void setProducerGroup(String producerGroup) { public void setProducerGroup(String producerGroup) {
this.producerGroup = producerGroup; this.producerGroup = producerGroup;
} }
......
此差异已折叠。
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
limitations under the License. limitations under the License.
--> -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>org.apache.rocketmq</groupId> <groupId>org.apache.rocketmq</groupId>
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册