Jstorm与RocketMQ整合

转自:http://blog.csdn.net/dlf123321/article/details/51824135


首先我们知道,rocketmq的consumer有两种,一种是DefaultMQPushConsumer另外一个是DefaultMQPullConsumer
两个有什么区别呢?
对我们自己写的代码来说,使用push就是被动接受mq的消息,而使用pull就是需要主动的去mq上拉取消息。
那么再与jstorm集成的时候,选择哪个呢?
我最开始选择的是pull,后来遇到各种问题,放弃了。
选择push才是真爱呀。
具体怎么做呢?
在spot的open里初始化DefaultMQPushConsumer,registerMessageListener的时候填入自己,当然我们的spot实现了MessageListenerConcurrently,
然后在spot里面的consumeMessage里面写自己的逻辑,合适的时候,用collector发射消息就是了。
能上点干货么?


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class EmitPaymentSpot extends BaseRichSpout   
  2.     implements MessageListenerConcurrently{  
  3.     private static final long serialVersionUID = -3085994102089532269L;   
  4.     private SpoutOutputCollector collector;  
  5.     private transient DefaultMQPushConsumer consumer;  
  6.   
  7.     @SuppressWarnings("rawtypes")  
  8.     public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {  
  9.          log.error("init DefaultMQPushConsumer");  
  10.           consumer = new DefaultMQPushConsumer(RaceConfig.MetaConsumerGroup);  
  11.   
  12.   
  13.          //   consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);  
  14.           consumer.setNamesrvAddr("ip:port")  
  15.    
  16.             try {  
  17.                 consumer.subscribe(RaceConfig.MqTmallTradeTopic, "*");  
  18.             consumer.subscribe(RaceConfig.MqTaobaoTradeTopic, "*");  
  19.             consumer.subscribe(RaceConfig.MqPayTopic, "*");  
  20.         } catch (MQClientException e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.             consumer.registerMessageListener(this);  
  24.             try {  
  25.             consumer.start();  
  26.         } catch (MQClientException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.   
  30.   
  31.             log.error("Consumer Started.");  
  32.             this.collector = collector;  
  33.         }  
  34.   
  35.     @Override  
  36.     public void nextTuple() {  
  37.         //do nothing  
  38.     }  
  39.   
  40.     @Override  
  41.     public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  42.         //...  
  43.     }  
  44.   
  45.     @Override  
  46.     public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {  
  47.   
  48.   
  49.         for (MessageExt msg : msgs) {  
  50.             byte[] body = msg.getBody();  
  51.             if (body.length == 2 && body[0] == 0 && body[1] == 0) {  
  52.                   
  53.                 log.error("Got the end signal");  
  54.                 collector.emit("stop",new Values("stop"));  
  55.                 continue;  
  56.             }  
  57.             if (msg.getTopic().equals(RaceConfig.MqPayTopic)) {  
  58.                 return doPayTopic(body);  
  59.             }else if (msg.getTopic().equals(RaceConfig.MqTaobaoTradeTopic)) {  
  60.                 putTaobaoTradeToTair(body);  
  61.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  
  62.             } else if (msg.getTopic().equals(RaceConfig.MqTmallTradeTopic)) {  
  63.                 putTmallTradeToTair(body);  
  64.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  
  65.             }else {  
  66.                 return ConsumeConcurrentlyStatus.RECONSUME_LATER;  
  67.             }  
  68.   
  69.   
  70.         }  
  71.         return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  
  72.     }  
  73. }  


当然还有第二种方式,是官方推荐的。
其实我觉得和我的方式差不多..
就是在生成consumer的时候使用工厂模式而已。
相关的代码,比较麻烦大家见


https://github.com/alibaba/jstorm/blob/master/jstorm-utility/jstorm-rocket-mq/src/main/java/com/alibaba/aloha/meta/MetaSpout.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值