RocketMQ是阿里巴巴在2012年開源的分佈式消息中間件,目前已經捐贈給Apache基金會,已經於2016年11月成爲 Apache 孵化項目,相信RocketMQ的未來會發揮着越來越大的作用,將有更多的開發者因此受益。
本文僅對RocketMQ的簡單實用做入門性介紹,不對RocketMQ的底層原理進行深入介紹,後續文章將對RocketMQ的原理做詳細介紹。
RocketMQ的Maven依賴:
- <!-- https://mvnrepository.com/artifact/com.alibaba.rocketmq/rocketmq-client -->
- <dependency>
- <groupId>com.alibaba.rocketmq</groupId>
- <artifactId>rocketmq-client</artifactId>
- <version>3.2.6</version>
- </dependency>
MQ的消費類RocketMQConsumer.java:
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListener;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
- import java.util.UUID;
- /**
- * Created by lance on 2017/2/10.
- */
- public class RocketMQConsumer {
- private DefaultMQPushConsumer consumer;
- private MessageListener listener;
- protected String nameServer;
- protected String groupName;
- protected String topics;
- public RocketMQConsumer(MessageListener listener, String nameServer, String groupName, String topics) {
- this.listener = listener;
- this.nameServer = nameServer;
- this.groupName = groupName;
- this.topics = topics;
- }
- public void init() {
- consumer = new DefaultMQPushConsumer(groupName);
- consumer.setNamesrvAddr(nameServer);
- try {
- consumer.subscribe(topics, "*");
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- consumer.setInstanceName(UUID.randomUUID().toString());
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
- consumer.registerMessageListener((MessageListenerConcurrently) this.listener);
- try {
- consumer.start();
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- System.out.println("RocketMQConsumer Started! group=" + consumer.getConsumerGroup() + " instance=" + consumer.getInstanceName()
- );
- }
- }
MQ消息的監聽接口類RocketMQListener.java
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.common.message.MessageExt;
- import java.util.List;
- /**
- * Created by lance on 2017/2/10.
- */
- public class RocketMQListener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- // System.out.println("get data from rocketMQ:" + msgs);
- for (MessageExt message : msgs) {
- String msg = new String(message.getBody());
- System.out.println("msg data from rocketMQ:" + msg);
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- }
MQ消息的生產者類RocketMQProducer.java
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
- import com.alibaba.rocketmq.client.producer.SendResult;
- import com.alibaba.rocketmq.client.producer.SendStatus;
- import com.alibaba.rocketmq.common.message.Message;
- import java.util.UUID;
- /**
- * Created by lance on 2017/2/10.
- */
- public class RocketMQProducer {
- private DefaultMQProducer sender;
- protected String nameServer;
- protected String groupName;
- protected String topics;
- public void init() {
- sender = new DefaultMQProducer(groupName);
- sender.setNamesrvAddr(nameServer);
- sender.setInstanceName(UUID.randomUUID().toString());
- try {
- sender.start();
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- }
- public RocketMQProducer(String nameServer, String groupName, String topics) {
- this.nameServer = nameServer;
- this.groupName = groupName;
- this.topics = topics;
- }
- public void send(Message message) {
- message.setTopic(topics);
- try {
- SendResult result = sender.send(message);
- SendStatus status = result.getSendStatus();
- System.out.println("messageId=" + result.getMsgId() + ", status=" + status);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
測試RocketMQ的消費 RocketMQConsumerTest.java
- package com.lance.rocketMQ.RocketMQ;
- /**
- * Created by lance on 2017/2/10.
- */
- public class RocketMQConsumerTest {
- public static void main(String[] args) {
- String mqNameServer = "172.10.254.2:9876";
- String mqTopics = "MQ-MSG-TOPICS-TEST";
- String consumerMqGroupName = "CONSUMER-MQ-GROUP";
- RocketMQListener mqListener = new RocketMQListener();
- RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);
- mqConsumer.init();
- try {
- Thread.sleep(1000 * 60L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
run RocketMQConsumerTest.java 之後,控制檯輸出:
- RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
MQ的生產者測試類:RocketMQProducerTest.java
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.common.message.Message;
- /**
- * Created by lance on 2017/2/10.
- */
- public class RocketMQProducerTest {
- public static void main(String[] args) {
- String mqNameServer = "172.10.254.2:9876";
- String mqTopics = "MQ-MSG-TOPICS-TEST";
- String producerMqGroupName = "PRODUCER-MQ-GROUP";
- RocketMQProducer mqProducer = new RocketMQProducer(mqNameServer, producerMqGroupName, mqTopics);
- mqProducer.init();
- for (int i = 0; i < 5; i++) {
- Message message = new Message();
- message.setBody(("I send message to RocketMQ " + i).getBytes());
- mqProducer.send(message);
- }
- }
- }
run RocketMQProducerTest.java 之後,RocketMQProducerTest.java 對應的控制檯輸出爲:
- messageId=0A71290100002A9F00000003D0BB0832, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB08BB, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB0944, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB09CD, status=SEND_OK
- messageId=0A71290300002A9F000000005440AEED, status=SEND_OK
此時查看RocketMQConsumerTest.java對應的控制檯輸出發生改變,輸出內容變更如下:
- RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
- msg data from rocketMQ:I send message to RocketMQ 1
- msg data from rocketMQ:I send message to RocketMQ 0
- msg data from rocketMQ:I send message to RocketMQ 3
- msg data from rocketMQ:I send message to RocketMQ 2
- msg data from rocketMQ:I send message to RocketMQ 4
看,簡單吧!
備註:小編自己使用了Apache版本的RocketMQ(即RocketMQ 4.*),發現只需要更改import的package的路徑而已,不需要修改其他代碼,請參考。
RocketMQ的重複問題解決方式:
參考鏈接:1.分佈式開放消息系統(RocketMQ)的原理與實踐 (強烈推薦)