rocketmq开发手册

转至元数据起始 

  

绑定host

使用前必须将jmenv.taobao.net域名绑定到提供nameserver地址的静态服务器地址 
例如,如果本地部署了提供nameserver地址的静态服务,可以这么配置
127.0.0.1 jmenv.taobao.net

目前没有测试机器,,拿我的机器做测试机器,,可以这么绑定
192.168.66.172 jmenv.taobao.net

 

为什么要绑定呢?参考 Rocektmq 部署章节

定义生产者


 

每一类生产者必须定义一个spring bean,,,而且该bean的producerGroup属性必须唯一(不能跟其他类的生产者重复),否则在使用分布式事务的时候会出现问题。

根据官方规范:producerGroup: 一般发送同样消息的Producer,归为同一个Group,应用必须设置,并保证命名唯一

 

producer配置
< bean id = "smsproducer" class = "com.alibaba.rocketmq.client.producer.DefaultMQProducer" init-method = "start" lazy-init = "true" >
      < property name = "producerGroup" value = "smsproductgroup" />
</ bean >

注意事项

init-method必须定义为start ,否则producer不会启动

 使用生产者

 


调用producer
< bean id = "sendmessage" class = "com.lifeix.apollo.user.service.impl.SendMessageDemo" >
         < property name = "producer" ref = "smsproducer" />
</ bean >

 

 

 

发消息
public class SendMessageDemo {
     private DefaultMQProducer producer;
     public DefaultMQProducer getProducer() {
     return producer;
     }
     public void setProducer(DefaultMQProducer producer) {
     this .producer = producer;
     }
     public void sendMessage() {
     Message msg = new Message( "TopicTest1" , // topic
             "TagA" , // tag
             "OrderID001" , // key
             ( "Hello MetaQ" ).getBytes()); // body
     SendResult sendResult;
     try {
         sendResult = producer.send(msg);
         System.out.println(sendResult);
         } catch (Exception e) {
         e.printStackTrace();
        }
     }
}

序列化

rocketmq 存储的是二进制数据,序列化,反序列化由使用者自己定义。 我们统一使用阿里推荐的fastjson 序列化对象,,。发送消息的时候把json string通过utf-8转成byte放入message中。 消费的时候,将byte数组转对象

https://github.com/alibaba/fastjson

 

 

pushconsumer 广播模式用法

 

consumer使用之前必须先调用subscribe 订阅topic ,还需要定义消费消息的Listener,,,没有办法全部在spring里面管理,,,

所以,只能显示的new DefaultMQPushConsumer对象,进行消费的操作

使用注意事项

以下代码必须在bean init方法里面使用,,,而且该bean spring配置必须配置成 init-method="init"

 

 

sample
public class ConsumeMessageClusteringDemo {
     protected void init() {
     DefaultMQPushConsumer consumer = new DefaultMQPushConsumer( "ConsumerGroupName" );
     /**
      * 订阅指定topic下tags分别等于TagA或TagC或TagD
      */
     try {
         consumer.setMessageModel(MessageModel.BROADCASTING); //设置 广播消费模式
         consumer.subscribe( "TopicTest1" , "TagA || TagC || TagD" );
         /**
          * 订阅指定topic下所有消息<br>
          * 注意:一个consumer对象可以订阅多个topic
          */
         consumer.subscribe( "TopicTest2" , "*" );
         /**
          * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
          * 如果非第一次启动,那么按照上次消费的位置继续消费
          */
         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
         consumer.registerMessageListener( new MessageListenerConcurrently() {
         /**
          * 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
          */
         @Override
         public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
             System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);
             MessageExt msg = msgs.get( 0 );
             if (msg.getTopic().equals( "TopicTest1" )) {
             // 执行TopicTest1的消费逻辑
             if (msg.getTags() != null && msg.getTags().equals( "TagA" )) {
                 // 执行TagA的消费
                 String msgbody = new String(msg.getBody());
                 System.out.println(msgbody);
             } else if (msg.getTags() != null && msg.getTags().equals( "TagC" )) {
                 // 执行TagC的消费
                 String msgbody = new String(msg.getBody());
                 System.out.println(msgbody);
             } else if (msg.getTags() != null && msg.getTags().equals( "TagD" )) {
                 // 执行TagD的消费
                 String msgbody = new String(msg.getBody());
                 System.out.println(msgbody);
             }
             } else if (msg.getTopic().equals( "TopicTest2" )) {
             // 执行TopicTest2的消费逻辑
             }
             return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
         }
         });
         /**
          * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
          */
         consumer.start();
      } catch (MQClientException e) {
         e.printStackTrace();
      }
     }
}

 

pushconsumer 集群模式用法

pushconsumer 集群消费模式,,,跟广播很相似,,只是setMessageModel 方法传参做点修改即可

  

consumer.setMessageModel(MessageModel.CLUSTERING); //设置 广播消费模式

 

demo代码参考

注:参考 apollo 工程目录结构  ssh://git@pangtong.l99.com:19022/framework/lifeix-demo.git

apollo.user.impl 模块

本文档旨在描述 本文档旨在描述 本文档旨在描述 本文档旨在描述 本文档旨在描述 本文档旨在描述 本文档旨在描述 RocketMQ RocketMQ RocketMQRocketMQRocketMQRocketMQ的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 的多个关键特性实现 原理 ,并对 消息中间件 消息中间件 消息中间件 消息中间件 消息中间件 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 遇到的各种问题进行总结,阐述 RocketMQ RocketMQ RocketMQRocketMQRocketMQ 如何解决这些问题。 如何解决这些问题。 如何解决这些问题。 如何解决这些问题。 文中主要引用了 文中主要引用了 文中主要引用了 文中主要引用了 JMSJMSJMS规范与 规范与 CORBA CORBA CORBA CORBA NotificationNotificationNotificationNotification Notification NotificationNotification 规范 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 ,规范为我们设计系统指明了 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 方向,但是仍有不少问题规范没提及对于 消息中间件 消息中间件 又至关重要。 又至关重要。 又至关重要。 RocketMQRocketMQ RocketMQRocketMQRocketMQ并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 并不遵循任何规范,但是参考了 各种规范与 各种规范与 同类 产品的 产品的 设计 思想 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值