1.安装
具体请参考官方说明:http://rocketmq.apache.org/docs/quick-start/
2.启动服务
2.1 启动Name Server
nohup sh bin/mqnamesrv &
2.2启动Broker
nohup sh bin/mqbroker -n localhost:9876 &
3.创建Topic
此处通过命令行创建Topic
sh mqadmin updateTopic -b localhost:10911 -t topicTest1 -n localhost:9876
说明:-b broker_id:broker_port。 broker_id是启动Broker的机器的ip,broker_port默认是10911
-t topicName
-n nameServerIp:nameServer_port Name Server的IP和端口
4.发送topic消息-producer
@Test
public void test27() throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
DefaultMQProducer producer=new DefaultMQProducer("group_1");
producer.setNamesrvAddr("localhost:9876");
producer.start();
for (int i=0;i<100;i++){
Message message=new Message(
"topicTest1","TagA",
("Hello RocketMq"+i).getBytes(RemotingHelper.DEFAULT_CHARSET)
);
SendResult result =producer.send(message);
System.out.printf("%s%n", result);
}
producer.shutdown();
}
结果:
3.关闭服务
3.1关闭Broker
sh bin/mqshutdown broker
3.2关闭Name Server
sh mqshutdown broker
5.接收消息-consumer
DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("consumerGroup_2");
consumer.setNamesrvAddr("localhost:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.setMessageModel(MessageModel.BROADCASTING);
//订阅topic为topicTest1的消息
consumer.subscribe("topicTest1","TagA");
consumer.setInstanceName(UUID.randomUUID().toString());
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext consumeConcurrentlyContext) {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
for (MessageExt message:msgs){
System.out.println(new String(message.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.printf("Consumer Started.%n");
如果像上面这样先运行producer发送topic再运行Consumer接收消息时,可以正常产生消息但是消费者无法消费消息,因为我用的时push的消费方式,当然若用pull的消费模式的话时没问题的,先那push模式来说。
push模式需要在消费者Consumer初始化完毕后在进行producer的消息发送才可以正常消费。
如下:
@Test
public void test32() throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
//生产者-start
DefaultMQProducer producer=new DefaultMQProducer("group_2");
producer.setNamesrvAddr("localhost:9876");
producer.start();
//生产者-end
// 消费者-start
DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("consumerGroup_2");
consumer.setNamesrvAddr("localhost:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.setMessageModel(MessageModel.BROADCASTING);
consumer.subscribe("topicTest1","TagA");
consumer.setInstanceName(UUID.randomUUID().toString());
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext consumeConcurrentlyContext) {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
for (MessageExt message:msgs){
System.out.println(new String(message.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.printf("Consumer Started.%n");
// 消费者-end
for (int i=0;i<100;i++){
Message message=new Message(
"topicTest2","TagA",
("你好 RocketMq"+i).getBytes(RemotingHelper.DEFAULT_CHARSET)
);
SendResult result =producer.send(message);
System.out.printf("%s%n", result);
}
producer.shutdown();
}
此时,当producer产生消息时会自动触发消费者的监听器,可以进行消费。
以下时pull的消费模式的示例:
DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("pullConsumer");
consumer.setNamesrvAddr("localhost:9876");
consumer.start();
Set<MessageQueue> mqs = consumer.fetchSubscribeMessageQueues("topicTest2");
for (MessageQueue mq : mqs) {
// System.out.println("Consume from the queue: " + mq);
System.out.println("当前获取的消息的归属队列是: " + mq.getQueueId());
PullResultExt pullResult = (PullResultExt) consumer.pullBlockIfNotFound(mq, null,0, 10000);
if (pullResult.getPullStatus().equals(PullStatus.FOUND)) {
List<MessageExt> messageExtList = pullResult.getMsgFoundList();
for (MessageExt m : messageExtList) {
System.out.println("收到了消息:" + new String(m.getBody()));
}
}
}