安装环境
- CentOS 7.0 64bit
- JDK1.8 64bit
条件有限,使用两台(192.168.1.101,192.168.1.102)虚拟机作为服务器,因此以2m-noslave(多master模式)来运行RocketMQ服务
下载及解压
选择华科镜像源,下载编译好的安装包(也可以下载RocketMQ项目源码,使用maven打包)
> wget http://mirrors.hust.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
解压到/usr/local
文件夹
> sudo unzip rocketmq-all-4.2.0-bin-release.zip -d /usr/local/rocketmq
修改文件夹所有者(USERNAME为系统登录用户名),避免无权限执行启动命令
> cd /usr/local/
> sudo chown -R USERNAME: rocketmq
修改配置文件
两台服务器都下载安装完后,修改机器192.168.1.101的MQ配置文件
> vim rocketmq/conf/2m-noslave/broker-a.properties
brokerClusterName=MyCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
namesrvAddr=192.168.1.101:9876;192.168.1.101:9876
brokerIP1=192.168.1.101
storePathCommitLog=/usr/local/rocketmq/store/commitlog
storePathConsumerQueue=/usr/local/rocketmq/store/consumequeue
修改机器192.168.1.102的MQ配置文件
> vim rocketmq/conf/2m-noslave/broker-b.properties
brokerClusterName=MyCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
namesrvAddr=192.168.1.101:9876;192.168.1.101:9876
brokerIP1=192.168.1.102
storePathCommitLog=/usr/local/rocketmq/store/commitlog
storePathConsumerQueue=/usr/local/rocketmq/store/consumequeue
启动服务
两台服务器分别启动Name Server
> cd rocketmq
> nohup sh bin/mqnamesrv &
查看Name Server启动日志
> tail -f logs/rocketmqlogs/namesrv.log
INFO main - The Name Server boot success. serializeType=JSON
启动服务器192.168.1.101的Broker
> nohup sh mqbroker -c conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
启动服务器192.168.1.102的Broker
> nohup sh mqbroker -c conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &
查看Broker启动日志
> tail -f logs/rocketmqlogs/broker.log
INFO main - The broker[broker-a, 192.168.1.101:10911] boot success. serializeType=JSON
关闭服务
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(11786) is running...
Send shutdown request to mqnamesrv(11786) OK
Java API调用示例
新建Maven项目,引入依赖包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.2.0</version>
</dependency>
Producer类,生产者,发送消息
public class Producer {
private static int count = 100;
public static void main(String[] args) throws Exception {
// 设置生产者组名
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
// 指定nameServer的地址
producer.setNamesrvAddr("192.168.1.101:9876;192.168.1.102:9876");
// 启动实例
producer.start();
final Semaphore semaphore = new Semaphore(0);
for (int i = 0; i < count; i++) {
Thread.sleep(3000);
Message message = new Message("TopicTest",
"test_tag",
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(message, new SendCallback() {
public void onSuccess(SendResult sendResult) {
System.out.println(String.format("message [%s] send success!", new String(message.getBody())));
semaphore.release();
}
public void onException(Throwable throwable) {
throwable.printStackTrace();
}
});
}
semaphore.acquire(count);
//关闭生产者,释放资源
producer.shutdown();
}
}
Consumer类,消费者,接受处理消息
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
//设置消费者组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
//设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//指定nameServer的地址
consumer.setNamesrvAddr("10.0.74.198:9876;10.0.74.199:9876");
//指定订阅的topic及tag表达式
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
MessageExt messageExt = msgs.get(0);
System.out.println(String.format("Custome message [%s],tagName[%s]",
new String(messageExt.getBody()),
messageExt.getTags()));
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//启动消费者实例
consumer.start();
System.out.println("Consumer Started.");
}
}
依次运行Consumer、Producer,控制台打印如下信息
#Producer console info
message [Hello RocketMQ 0] send success!
message [Hello RocketMQ 1] send success!
message [Hello RocketMQ 2] send success!
message [Hello RocketMQ 3] send success!
...
#Consumer console info
Custome message [Hello RocketMQ 0],tagName[test_tag]
Custome message [Hello RocketMQ 1],tagName[test_tag]
Custome message [Hello RocketMQ 2],tagName[test_tag]
Custome message [Hello RocketMQ 3],tagName[test_tag]
...
常见运行错误“No Topic Route Info”,请检查防火墙是否开启并放开9876和10911两个端口!
转载请注明出处,谢谢!