Spring 整合 RocketMQ
1. 引入jar包
<!-- RocketMQ -->
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-all</artifactId>
<version>3.2.6</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.2.6</version>
</dependency>
2.Spring bean 配置单例
<bean id="myProducer" class="cn.zno.rocketmq.MyProducer"
init-method="init"
destroy-method="destroy"
scope="singleton">
<property name="producerGroup" value="MyProducerGroup" />
<property name="namesrvAddr" value="127.0.0.1:9876" />
</bean>
<bean class="cn.zno.rocketmq.MyConsumer"
init-method="init"
destroy-method="destroy"
scope="singleton">
<property name="consumerGroup" value="MyConsumerGroup" />
<property name="namesrvAddr" value="127.0.0.1:9876" />
</bean>
3. 自定义producer
package cn.zno.rocketmq; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer; public class MyProducer { private final Logger logger = LoggerFactory.getLogger(MyProducer.class); private DefaultMQProducer defaultMQProducer;
private String producerGroup;
private String namesrvAddr; /**
* Spring bean init-method
*/
public void init() throws MQClientException {
// 参数信息
logger.info("DefaultMQProducer initialize!");
logger.info(producerGroup);
logger.info(namesrvAddr); // 初始化
defaultMQProducer = new DefaultMQProducer(producerGroup);
defaultMQProducer.setNamesrvAddr(namesrvAddr);
defaultMQProducer.setInstanceName(String.valueOf(System.currentTimeMillis())); defaultMQProducer.start(); logger.info("DefaultMQProudcer start success!"); } /**
* Spring bean destroy-method
*/
public void destroy() {
defaultMQProducer.shutdown();
} public DefaultMQProducer getDefaultMQProducer() {
return defaultMQProducer;
} // ---------------setter ----------------- public void setProducerGroup(String producerGroup) {
this.producerGroup = producerGroup;
} public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
} }
4. 自定义consumer
package cn.zno.rocketmq; import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
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.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.message.MessageExt;
import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel; public class MyConsumer { private final Logger logger = LoggerFactory.getLogger(MyConsumer.class); private DefaultMQPushConsumer defaultMQPushConsumer;
private String namesrvAddr;
private String consumerGroup; /**
* Spring bean init-method
*/
public void init() throws InterruptedException, MQClientException { // 参数信息
logger.info("DefaultMQPushConsumer initialize!");
logger.info(consumerGroup);
logger.info(namesrvAddr); // 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>
// 注意:ConsumerGroupName需要由应用来保证唯一
defaultMQPushConsumer = new DefaultMQPushConsumer(consumerGroup);
defaultMQPushConsumer.setNamesrvAddr(namesrvAddr);
defaultMQPushConsumer.setInstanceName(String.valueOf(System.currentTimeMillis())); // 订阅指定MyTopic下tags等于MyTag defaultMQPushConsumer.subscribe("MyTopic", "MyTag"); // 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
// 如果非第一次启动,那么按照上次消费的位置继续消费
defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); // 设置为集群消费(区别于广播消费)
defaultMQPushConsumer.setMessageModel(MessageModel.CLUSTERING); defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() { // 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { MessageExt msg = msgs.get(0);
if (msg.getTopic().equals("MyTopic")) {
// TODO 执行Topic的消费逻辑
if (msg.getTags() != null && msg.getTags().equals("MyTag")) {
// TODO 执行Tag的消费
}
}
// 如果没有return success ,consumer会重新消费该消息,直到return success
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}); // Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
defaultMQPushConsumer.start(); logger.info("DefaultMQPushConsumer start success!");
} /**
* Spring bean destroy-method
*/
public void destroy() {
defaultMQPushConsumer.shutdown();
} // ----------------- setter -------------------- public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
} public void setConsumerGroup(String consumerGroup) {
this.consumerGroup = consumerGroup;
} }
5. 发消息
@Autowired
private MyProducer myProducer; public void sendMessage() {
Message msg = new Message("MyTopic", "MyTag", (JSONObject.fromObject(someMessage)).getBytes());
SendResult sendResult = null;
try {
sendResult = myProducer.getDefaultMQProducer().send(msg);
} catch (MQClientException e) {
logger.error(e.getMessage() + String.valueOf(sendResult));
}
// 当消息发送失败时如何处理
if (sendResult == null || sendResult.getSendStatus() != SendStatus.SEND_OK) {
// TODO
}
}
Spring 整合 RocketMQ的更多相关文章
- spring-boot-route(十五)整合RocketMQ
RocketMQ简介 RocketMQ是阿里巴巴开源的消息中间件.目前已经贡献给Apache软件基金会,成为Apache的顶级项目. rocketMQ基本概念 1. Producer Group 生产 ...
- RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)
1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...
- 使用Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】
一.Spring整合Hibernate 1.如果一个DAO 类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了:如果一个DAO类没有 ...
- spring整合hibernate的详细步骤
Spring整合hibernate需要整合些什么? 由IOC容器来生成hibernate的sessionFactory. 让hibernate使用spring的声明式事务 整合步骤: 加入hibern ...
- Spring整合Ehcache管理缓存
前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存. Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它 ...
- spring整合hibernate
spring整合hibernate包括三部分:hibernate的配置.hibernate核心对象交给spring管理.事务由AOP控制 好处: 由java代码进行配置,摆脱硬编码,连接数据库等信息更 ...
- MyBatis学习(四)MyBatis和Spring整合
MyBatis和Spring整合 思路 1.让spring管理SqlSessionFactory 2.让spring管理mapper对象和dao. 使用spring和mybatis整合开发mapper ...
- Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来
转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...
随机推荐
- linux下安装以及升级npm,node的方法
1.最开始使用阿里云文档提供的安装方法一直都是失败的状态,后来找到了新的方法重新安装,按照以下操作一步一步的走即可实现,亲测可用 2.安装完之后,会发现npm和node的版本都偏低,需要重新升级以下, ...
- js第三天知识点 循环
/*for(重点) *while *do..while * *3种循环的区别: *for 主要适用于 明确循环次数的 循环 *while 适用于 不明确循环次数的循环 *do..while 适用于 ...
- Aspose.words四 bookmark
通过添加bookmark书签来添加数据,首先通过方法MoverToBookmark移动指定的标签位置,然后添加数据,添加完成后清除掉bookmark标示. string templateFile = ...
- spirng中的asm与jdk不兼容<已解决>
转载自:spirng中的asm与jdk不兼容<已解决> 前言 不知道前面对eclipse做了什么,使用maven来创建项目,然后转成web,启动的时候一直报错.我弄了好久,还是无法解决,先 ...
- 对于devexpress gridview 内插图加加进度条等的一点解读
如上图,gategory 加了小图标, 其他行内还有计算器,大图片 进度条等 using System; using System.Drawing; using System.Collection ...
- c#启动windows服务问题总结
程序以管理员权限运行的原因 在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下 ...
- Oracle_PL/SQL(5) 包
包1.定义:包用于逻辑组合相关的PL/SQL类型,项和子程序,由包规范和包体组成 建立包规范:包规范是包与应用程序之间的接口,用于定义包的公用组件, 包括常量,变量,游标,过程,函数等 建立包体:用于 ...
- Liunx ls命令
ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...
- $ each() 小结
each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...
- MVC 第一章(下)
继续第一章 用Javascript and jQuery调用Web API 在上一节,我们用浏览器直接调用web API.但是大多数web API被客户端应用以编程的方式调用.那么我们写一个简单的ja ...