淘宝消息中间件RocketMQ的安装和简单使用

来源:互联网 发布:淘宝返利怎么操作 编辑:程序博客网 时间:2024/06/06 01:37
RocketMQ是什么?
RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
RocketMQ是alibaba开源的java消息中间件。在github上开源,项目同时也在oschina上。地址:https://git.oschina.net/vintagewang/RocketMQ/
下载RocketMQ3.0.8 最新的是3.1.0 试了好多次,编译怎么都不行啊。
果断使用了3.0.8
https://github.com/alibaba/RocketMQ/archive/v3.0.8.zip 本人机器有点问题git居然安装不上(纳闷啊)直接下的zip包。
解压开来,找到项目中pom.xml并且把其中的
<parent>
<groupId>com.taobao</groupId>
<artifactId>parent</artifactId>
<version>1.0.2</version>
</parent>
给注释掉,不然弄死不能编译的,我可是折腾了好久好久啊,这是由于阿里开源不彻底导致的。
下面开始编译吧。cmd控制台进到解压文件夹的pom.xml目录 执行
mvn -Dmaven.test.skip=true clean package install assembly:assembly -U  或者直接运行根目录下的install.cmd 推荐控制台运行,能直观的看到错误信息。install.cmd出错了控制台就没了。注释了parent之后应该就不报错了。等待它去网上下载完的jar包,并且编译完吧。
编译完成之后,根目录下回多出来一个叫target的目录,将里面的alibaba-rocketmq-3.0.8文件夹拷贝到你的安装盘符下吧,
命令行进入到${alibaba-rocketmq-3.0.8}/bin 输入start mqnamesrv.exe 会弹出一个信息窗口,记录的是日志也可以写到文件中 后面接着写 >${你的日志存放目录} ,在日志文件中看到The name Server boot success 说明启动成功了,输入jps -v 检测
2636 -Djava.ext.dirs=F:\taobao\alibaba-rocketmq-3.0.8\alibaba-rocketmq\bin/../lib-Drocketmq.home.dir=F:\taobao\alibaba-rocketmq-3.0.8\alibaba-rocketmq\bin/..-XX:MaxNewSize=512M -XX:MaxPermSize=128M -XX:NewSize=256M -XX:PermSize=128M -Xms512m -Xmx1g exit abort
启动borker start mqbroker.exe -n 127.0.0.1:9876 同样的弹出一个窗口 看到success表示成功了,文件日志同上。
Java操作列子,来自开源项目中。
建立一个普通的maven项目
Pom中加入如下配置

Xml代码  收藏代码
  1. <dependencies>  
  2.     <dependency>  
  3.          <groupId>com.alibaba.rocketmq</groupId>  
  4.          <artifactId>rocketmq-client</artifactId>  
  5.          <version>3.0.8</version>  
  6.       </dependency>  
  7.       <dependency>  
  8.          <groupId>com.alibaba.rocketmq</groupId>  
  9.          <artifactId>rocketmq-all</artifactId>  
  10.          <version>3.0.8</version>  
  11.          <type>pom</type>  
  12.       </dependency>  
  13.       <dependency>  
  14.          <groupId>ch.qos.logback</groupId>  
  15.          <artifactId>logback-classic</artifactId>  
  16.          <version>1.1.1</version>  
  17.       </dependency>  
  18.       <dependency>  
  19.          <groupId>ch.qos.logback</groupId>  
  20.          <artifactId>logback-core</artifactId>  
  21.          <version>1.1.1</version>  
  22.       </dependency>  
  23.       <dependency>  
  24.          <groupId>junit</groupId>  
  25.          <artifactId>junit</artifactId>  
  26.          <version>4.10</version>  
  27.          <scope>test</scope>  
  28.       </dependency>  
  29.   </dependencies>  

消息生产者
Java代码  收藏代码
  1. package rocketmq_test.test;  
  2.   
  3. import java.util.concurrent.TimeUnit;  
  4.   
  5. import com.alibaba.rocketmq.client.exception.MQClientException;  
  6. import com.alibaba.rocketmq.client.producer.DefaultMQProducer;  
  7. import com.alibaba.rocketmq.client.producer.SendResult;  
  8. import com.alibaba.rocketmq.common.message.Message;  
  9.   
  10. public class Producer {  
  11.      public static void main(String[] args) throws MQClientException,  
  12.      InterruptedException{  
  13.   /** 
  14.    * 一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例<br> 
  15.    * 注意:ProducerGroupName需要由应用来保证唯一<br> 
  16.    * ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键, 
  17.    * 因为服务器会回查这个Group下的任意一个Producer 
  18.    */  
  19.   final DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");  
  20.   producer.setNamesrvAddr("127.0.0.1:9876");  
  21.   producer.setInstanceName("Producer");  
  22.   
  23.   /** 
  24.    * Producer对象在使用之前必须要调用start初始化,初始化一次即可<br> 
  25.    * 注意:切记不可以在每次发送消息时,都调用start方法 
  26.    */  
  27.   producer.start();  
  28.   
  29.   /** 
  30.    * 下面这段代码表明一个Producer对象可以发送多个topic,多个tag的消息。 
  31.    * 注意:send方法是同步调用,只要不抛异常就标识成功。但是发送成功也可会有多种状态,<br> 
  32.    * 例如消息写入Master成功,但是Slave不成功,这种情况消息属于成功,但是对于个别应用如果对消息可靠性要求极高,<br> 
  33.    * 需要对这种情况做处理。另外,消息可能会存在发送失败的情况,失败重试由应用来处理。 
  34.    */  
  35.   for (int i = 0; i < 10; i++){  
  36.      try {  
  37.         {  
  38.             Message msg = new Message("TopicTest1",// topic  
  39.                   "TagA",// tag  
  40.                   "OrderID001",// key  
  41.                   ("Hello MetaQA").getBytes());// body  
  42.             SendResult sendResult = producer.send(msg);  
  43.             System.out.println(sendResult);  
  44.         }  
  45.   
  46.         {  
  47.             Message msg = new Message("TopicTest2",// topic  
  48.                   "TagB",// tag  
  49.                   "OrderID0034",// key  
  50.                   ("Hello MetaQB").getBytes());// body  
  51.             SendResult sendResult = producer.send(msg);  
  52.             System.out.println(sendResult);  
  53.         }  
  54.   
  55.         {  
  56.             Message msg = new Message("TopicTest3",// topic  
  57.                   "TagC",// tag  
  58.                   "OrderID061",// key  
  59.                   ("Hello MetaQC").getBytes());// body  
  60.             SendResult sendResult = producer.send(msg);  
  61.             System.out.println(sendResult);  
  62.         }  
  63.      }catch(Exception e) {  
  64.         e.printStackTrace();  
  65.      }  
  66.      TimeUnit.MILLISECONDS.sleep(1000);  
  67.   }  
  68.   
  69.   /** 
  70.    * 应用退出时,要调用shutdown来清理资源,关闭网络连接,从MetaQ服务器上注销自己 
  71.    * 注意:我们建议应用在JBOSS、Tomcat等容器的退出钩子里调用shutdown方法 
  72.    */  
  73. //producer.shutdown();  
  74.   Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {  
  75.      public void run() {  
  76.         producer.shutdown();  
  77.      }  
  78.   }));  
  79.   System.exit(0);  
  80. }  
  81. }  

消费者处理消息
Java代码  收藏代码
  1. package rocketmq_test.test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  6. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  8. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  9. import com.alibaba.rocketmq.client.exception.MQClientException;  
  10. import com.alibaba.rocketmq.common.message.MessageExt;  
  11.   
  12. public class Consumer {  
  13.      /**  
  14.      * 当前例子是PushConsumer用法,使用方式给用户感觉是消息从RocketMQ服务器推到了应用客户端。<br>  
  15.      * 但是实际PushConsumer内部是使用长轮询Pull方式从MetaQ服务器拉消息,然后再回调用户Listener方法<br>  
  16.      */    
  17.     public static void main(String[] args) throws InterruptedException,    
  18.                        MQClientException{    
  19.               /**  
  20.                * 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>  
  21.                * 注意:ConsumerGroupName需要由应用来保证唯一  
  22.                */    
  23.               DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(    
  24.                                 "ConsumerGroupName");    
  25.               consumer.setNamesrvAddr("127.0.0.1:9876");    
  26.               consumer.setInstanceName("Consumber");    
  27.   
  28.               /**  
  29.                * 订阅指定topic下tags分别等于TagA或TagC或TagD  
  30.                */    
  31.               consumer.subscribe("TopicTest1","TagA || TagC || TagD");    
  32.               /**  
  33.                * 订阅指定topic下所有消息<br>  
  34.                * 注意:一个consumer对象可以订阅多个topic  
  35.                */    
  36.               consumer.subscribe("TopicTest2","*");    
  37.   
  38.               consumer.registerMessageListener(new MessageListenerConcurrently() {    
  39.   
  40.                        public ConsumeConcurrentlyStatus consumeMessage(    
  41.                                           List<MessageExt>msgs, ConsumeConcurrentlyContext context) {    
  42.   
  43.                                 System.out.println(Thread.currentThread().getName()    
  44.                                                    +" Receive New Messages: " + msgs.size());    
  45.   
  46.                                 MessageExt msg = msgs.get(0);    
  47.                                 if(msg.getTopic().equals("TopicTest1")) {    
  48.                                           //执行TopicTest1的消费逻辑    
  49.                                           if(msg.getTags() != null && msg.getTags().equals("TagA")) {    
  50.                                                    //执行TagA的消费    
  51.                                                    System.out.println(new String(msg.getBody()));    
  52.                                           }else if (msg.getTags() != null    
  53.                                                             &&msg.getTags().equals("TagC")) {    
  54.                                                    //执行TagC的消费    
  55.                                                    System.out.println(new String(msg.getBody()));    
  56.                                           }else if (msg.getTags() != null    
  57.                                                             &&msg.getTags().equals("TagD")) {    
  58.                                                    //执行TagD的消费    
  59.                                                    System.out.println(new String(msg.getBody()));    
  60.                                           }    
  61.                                 }else if (msg.getTopic().equals("TopicTest2")) {    
  62.                                           System.out.println(new String(msg.getBody()));    
  63.                                 }    
  64.   
  65.                                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;    
  66.   
  67.                        }    
  68.               });    
  69.   
  70.               /**  
  71.                * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>  
  72.                */    
  73.               consumer.start();    
  74.   
  75.               System.out.println("ConsumerStarted.");    
  76.     }    
  77. }  


启动消费者
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-8 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-9 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-10 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-11 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-12 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-13 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-14 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-15 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-16 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-17 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-18 Receive New Messages: 1
Hello MetaQB
ConsumeMessageThread-ConsumerGroupName-19 Receive New Messages: 1
Hello MetaQA
ConsumeMessageThread-ConsumerGroupName-20 Receive New Messages: 1
Hello MetaQB

运行生产者,
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002715, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=2], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F00000000000027AB, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=2], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002840, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F00000000000028D5, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F000000000000296B, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002A00, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002A95, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002B2B, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002BC0, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002C55, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002CEB, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002D80, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=2], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002E15, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=2], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002EAB, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=2], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002F40, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000002FD5, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F000000000000306B, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=3], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000003100, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000003195, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F000000000000322B, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=0], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F00000000000032C0, messageQueue=MessageQueue [topic=TopicTest1, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F0000000000003355, messageQueue=MessageQueue [topic=TopicTest2, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8490100002A9F00000000000033EB, messageQueue=MessageQueue [topic=TopicTest3, brokerName=E97M3HS2ANMGCSZ, queueId=1], queueOffset=8]
分享到:
0 0
原创粉丝点击