Jstorm与RocketMQ整合
如果是经常关注阿里巴巴的朋友们,看到我这篇博客的题目,就知道我在参加今年的中间件比赛。
好了,废话不说,开始了。
首先我们知道,rocketmq的consumer有两种,一种是DefaultMQPushConsumer另外一个是DefaultMQPullConsumer
两个有什么区别呢?
对我们自己写的代码来说,使用push就是被动接受mq的消息,而使用pull就是需要主动的去mq上拉取消息。
那么再与jstorm集成的时候,选择哪个呢?
我最开始选择的是pull,后来遇到各种问题,放弃了。
选择push才是真爱呀。
具体怎么做呢?
在spot的open里初始化DefaultMQPushConsumer,registerMessageListener的时候填入自己,当然我们的spot实现了MessageListenerConcurrently,
然后在spot里面的consumeMessage里面写自己的逻辑,合适的时候,用collector发射消息就是了。
能上点干货么?
public class EmitPaymentSpot extends BaseRichSpout
implements MessageListenerConcurrently{
private static final long serialVersionUID = -3085994102089532269L;
private SpoutOutputCollector collector;
private transient DefaultMQPushConsumer consumer;
@SuppressWarnings("rawtypes")
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
log.error("init DefaultMQPushConsumer");
consumer = new DefaultMQPushConsumer(RaceConfig.MetaConsumerGroup);
// consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.setNamesrvAddr("ip:port")
try {
consumer.subscribe(RaceConfig.MqTmallTradeTopic, "*");
consumer.subscribe(RaceConfig.MqTaobaoTradeTopic, "*");
consumer.subscribe(RaceConfig.MqPayTopic, "*");
} catch (MQClientException e) {
e.printStackTrace();
}
consumer.registerMessageListener(this);
try {
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
log.error("Consumer Started.");
this.collector = collector;
}
@Override
public void nextTuple() {
//do nothing
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//...
}
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
byte[] body = msg.getBody();
if (body.length == 2 && body[0] == 0 && body[1] == 0) {
log.error("Got the end signal");
collector.emit("stop",new Values("stop"));
continue;
}
if (msg.getTopic().equals(RaceConfig.MqPayTopic)) {
return doPayTopic(body);
}else if (msg.getTopic().equals(RaceConfig.MqTaobaoTradeTopic)) {
putTaobaoTradeToTair(body);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} else if (msg.getTopic().equals(RaceConfig.MqTmallTradeTopic)) {
putTmallTradeToTair(body);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}else {
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
当然还有第二种方式,是官方推荐的。
其实我觉得和我的方式差不多..
就是在生成consumer的时候使用工厂模式而已。
相关的代码,比较麻烦大家见
https://github.com/alibaba/jstorm/blob/master/jstorm-utility/jstorm-rocket-mq/src/main/java/com/alibaba/aloha/meta/MetaSpout.java
Jstorm与RocketMQ整合的更多相关文章
- RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
目录 1.阅读源码之前的思考 2.从 Broker 启动流程看 DLedger 2.1 构建 DefaultMessageStore 2.2 增加节点状态变更事件监听器 2.3 调用 DefaultM ...
- Jstorm+Spring+mybatis整合
在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库. 在网上寻找了一下,发现storm集成 ...
- 面试官:小伙子,你给我简单说一下RocketMQ 整合 Spring Boot吧
前言 在使用SpringBoot的starter集成包时,要特别注意版本.因为SpringBoot集成RocketMQ的starter依赖是由Spring社区提供的,目前正在快速迭代的过程当中,不同版 ...
- SSM整合RocketMQ
前言 RocketMQ是一个由阿里巴巴开源的消息中间件,脱胎于阿里内部使用的MetaQ,本文主要是写个小例子演示一下消息从生产到消费的过程. RocketMQ下载和安装 下载地址 http://roc ...
- SpringBoot Kafka 整合使用
前提 假设你了解过 SpringBoot 和 Kafka. 1.SpringBoot 如果对 SpringBoot 不了解的话,建议去看看 DD 大佬 和 纯洁的微笑 的系列博客. 2.Kafka K ...
- RocketMQ 升级到主从切换(DLedger、多副本)实战
目录 1.RocketMQ DLedger 多副本即主从切换核心配置参数详解 2.搭建主从同步环境 3.主从同步集群升级到DLedger 3.1 部署架构 3.2 升级步骤 3.3 验证消息发送与消息 ...
- RocketMq灰皮书(二)------本地部署启动MQ
RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...
- SpringBoot Admin 使用指南
什么是 SpringBoot Admin? Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序.这些应用程序通过 Spring Boot Admin ...
- 使用Arthas 获取Spring ApplicationContext还原问题现场
## 背景 最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现 ``` 1#!/bin/bash 2URL="http ...
随机推荐
- [HNOI 2004]树的计数
Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...
- 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi
那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11 ...
- [SCOI2016]背单词
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
- ●BZOJ 1692 [Usaco2007 Dec]队列变换
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1692 题解: 后缀数组,贪心由于每次可以取出旧队列的首部或尾部放在新队列的尾部.所以就需要比 ...
- hdu 3308 最长连续上升区间
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- C语言程序设计 第一次作业
(一)实验总结 1.求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 (4)实验分析问题一:输出时往输出框输不上.原因 :没有加双引号.2.判断闰 ...
- Chrome的First Paint
前言 First paint 直译过来的意思就是浏览器第一次渲染(paint),在First paint之前是白屏,在这个时间点之后用户就能看到(部分)页面内容. 所以研究这个First Paint的 ...
- json字符串转json对象,json对象转换成java对象
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- 分布式改造剧集之Redis缓存采坑记
Redis缓存采坑记 前言 这个其实应该属于分布式改造剧集中的一集(第一集见前面博客:http://www.cnblogs.com/Kidezyq/p/8748961.html),本来按照顺序 ...
- SVN错误:SVN Working copy XXX is too old
出错原因: 这是因为使用了低版本的svn生成了.svn内文件内容,但是,使用高版本svn同步时便出现该问题. 解决方法: 找到报错对应的文件夹,里面有个名为.svn的文件夹,删除这个文件夹(这是svn ...