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 ...
随机推荐
- ret和retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面两步操作: (IP) = ((ss)*16+ ...
- setTimeout设置为0的意义
今天再看 Promise 代码时,有个地方用到了setTimeOut函数,但是第2个参数设为0,顿时懵逼了,这是啥意思? function resolve(newValue) { value = ne ...
- linux 压缩命令
.zip格式压缩 zip 压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 #压缩目录 .zip格式解压缩 unzip 压缩文件 #解压缩 .gz格式压缩 gzip ...
- Minimum number of steps 805D
http://codeforces.com/contest/805/problem/D D. Minimum number of steps time limit per test 1 second ...
- iOS.Crash.Case-[__NSArrayM objectForKeyedSubscript:]
1. [__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance - source code and s ...
- eclipse集成svn进行项目开发
在用eclipse进行项目开发的时候,报了一个错误:switch不支持String的参数.这个问题的原因是因为jre版本低于1.7,而当前的eclipse版本最高只能选1.6,无奈,我只能考虑换ecl ...
- windows下git的使用方法(码云)
这表文章主要是用了可视化操作: 使用命令行操作:https://www.cnblogs.com/mswyf/p/9370238.html 一.安装Git Bash 为了在windows下使用Git,我 ...
- Servlet封装类
Servlet 提供了四个封装类: public class ServletRequestWrapper extends java.lang.Object implements ServletRequ ...
- java正则表达式(字符串)
参考:http://blog.csdn.net/kdnuggets/article/details/2526588 补充: ?号的使用: ^/branch/([a-z]+[/]?)$ 可以匹配 /b ...
- 摹客 iDoc 12月上半月新功能点评
转眼就到了2018年的最后一个月,小伙伴们是不是都在奋力拼搏做年底的冲刺呢?摹客也没有放慢脚步,不断地优化,给大家带来一个又一个的惊喜.那么,让小摹来带大家看看12月摹客iDoc更新了哪些特色功能: ...