Apache RocketMQ 4.2.0 安装及API调用教程

安装环境

  • 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两个端口!

转载请注明出处,谢谢!

猜你喜欢

转载自my.oschina.net/buru1kan/blog/1806173