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()));
}
}
}