前提 RocketMQ的部署环境可用

1 依赖包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.3</version>
</dependency>

2 yml的rocketMQ 的配置

rocketmq:
# 多个用;隔开
name-server: 10.22.15.61:9876;10.22.15.60:9876
producer:
# 生产组
group: cip-group
# 发送消息超时时间,默认 3000
sendMessageTimeout: 3000
# 发送消息失败重试次数,默认2
retryTimesWhenSendFailed: 2
# 发送异步消息失败重试次数,默认2
retryTimesWhenSendAsyncFailed: 2



3 注入 RocketMQTemplate 就可以发送消息
@Autowired
private RocketMQTemplate rocketMQTemplate;



4 发送消息例子
package com.bs.it.esi.controller;

import com.alibaba.fastjson.JSON;
import com.bs.it.esi.config.IdWorker;
import com.bs.platform.core.annotations.WhiteList;
import com.bs.platform.core.vo.CommonResult;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.apache.rocketmq.client.MQAdmin;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/rocketmq")
@Api(tags = "rocket 消息发送测试")
public class RocketMqDemo {

@Autowired
private IdWorker idWorker;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private MQAdmin mqAdmin;

@GetMapping("send/{id}")
@WhiteList
@ApiOperation("发送消息")
public CommonResult send(@PathVariable("id") String id) throws UnsupportedEncodingException {
// MessageConst
// MessageBuilder.withPayload("123").setHeader("",""); 链式调用

for (int i = 0; i < 5; i++) {
SendResult sendResult = rocketMQTemplate.syncSend("rocket-topic-7:AA", MessageBuilder.withPayload("mq发送消息测试AA" + i).build());
System.out.println(sendResult);
}
// rocketMQTemplate.send("rocket-topic-711",MessageBuilder.withPayload("mq发送消息测试a:").build());
// SendResult result = rocketMQTemplate.syncSend("rocket-topic-01", MessageBuilder.withPayload("mq发送消息测试a:"+i).build(), 3000);
return new CommonResult("发送成功!!");
}

@GetMapping("sendTransaction")
@WhiteList
@ApiOperation("事务消息")
public CommonResult sendTransaction(@RequestParam(name = "mes") String mes) throws UnsupportedEncodingException {
// 事务消息
// 事务消息就是将发送消息和本地数据库操作融合为同一个事务,二者要么都成功,要么都失败,不能出现一个操作成功另一操作失败的情况。
TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction("rocket-topic-7", MessageBuilder.withPayload(mes).build(),null);
System.out.println("-----"+result);
return new CommonResult("发送完成");
}

// 顺序消息
@GetMapping("sendselector")
@WhiteList
@ApiOperation("发送顺序消息")
public CommonResult sendselector(@RequestParam(name = "mes") String mes) {

rocketMQTemplate.setMessageQueueSelector((List<MessageQueue> mqs, Message msg, Object arg) -> {
int queuqInx = arg.toString().hashCode() % (mqs.size());
System.out.println("获取到的队列为:"+queuqInx+" msg "+ new String(msg.getBody()));
return mqs.get(queuqInx);
});
for (int i = 0; i < 5; i++) {
SendResult sendResult = rocketMQTemplate.syncSendOrderly("rocket-topic-7",
MessageBuilder.withPayload("发送的顺序消息" + i).build(), "2");
System.out.println("sendResult: "+sendResult);
}
return new CommonResult();
}

// 批量的消息
@GetMapping("batchSend")
@WhiteList
@ApiOperation("批量的消息")
public CommonResult batchSend(@RequestParam(name = "mes") String mes) {
List<org.springframework.messaging.Message> lists = new ArrayList<>();
for (int i = 0; i < 10; i++) {
org.springframework.messaging.Message<String> build = MessageBuilder.withPayload("批量发送消息的测试。。 :" + i).build();
lists.add(build);
}
List<List<org.springframework.messaging.Message>> partition = Lists.partition(lists, 300);
partition.forEach(li -> {
SendResult sendResult = rocketMQTemplate.syncSend("rocket-topic-7", li, 20000);
System.out.println("--------------------------"+sendResult);
});
return new CommonResult();
}

// 控制消息消费的个数
@GetMapping("batchCount")
@WhiteList
@ApiOperation("控制消息消费的个数")
public CommonResult batchCount(@RequestParam(name = "mes") String mes) {
List<org.springframework.messaging.Message> lists = new ArrayList<>();
for (int i = 0; i < 10; i++) {
org.springframework.messaging.Message<String> build = MessageBuilder.withPayload("批量发送消息的测试。。 :" + i).build();
lists.add(build);
}
SendResult sendResult = rocketMQTemplate.syncSend("rocket-topic-7", lists, 10000);
System.out.println(sendResult);
return new CommonResult();
}

}

其中 事务消息需要另外的实现一个RocketMQLocalTransactionListener类

import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

@Component
@RocketMQTransactionListener()
public class MYRocketMQLocalTransactionListener implements RocketMQLocalTransactionListener {

@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
System.out.println("开始执行本地事务---");
System.out.println("message: "+message);
if (new String((byte[]) message.getPayload()).length() > 5){
return RocketMQLocalTransactionState.COMMIT;
}else if (message.getPayload().toString().length() == 8){
return RocketMQLocalTransactionState.ROLLBACK;
}
return RocketMQLocalTransactionState.UNKNOWN;
}

@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
System.out.println("消息的回查----");
return RocketMQLocalTransactionState.COMMIT;
}
}

消费者监听消息:

import com.bs.platform.core.redis.RedisCacheUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RocketMQMessageListener(topic = "fdc_draw_chart_topic",
consumerGroup = "fdc-group")
// CONCURRENTLY 并发(消息无序) ORDERLY 单线程(有序)
public class RocketConsumer implements RocketMQListener<MessageExt> {

@Autowired
private RedisCacheUtils redisCacheUtils;
@Override
public void onMessage(MessageExt messageExt) {
// Object aaa = redisCacheUtils.get("aaa");
// if (aaa == null){
// redisCacheUtils.set("aaa","1",10000);
// log.info("程序出错,消息从新拉取消费");
// throw new RuntimeException("出错了");
// }

log.info("----------------------------------------------------------------- :"+new String(messageExt.getBody()).toString());
}
}


更加细致的消息发送和监听 可以参考官网 欢迎交流

springboot 整合 recketMQ 详细步骤的更多相关文章

  1. SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)

    准备工作 环境准备 JAVA版本 java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121 ...

  2. Springboot 整合 MyBatisPlus[详细过程]

    Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBatisPlus启动依赖, ...

  3. SpringBoot整合Swagger2详细教程

    1. 简介   随着前后端分离开发模式越来越流行,编写接口文档变成了开发人员非常头疼的事.而Swagger是一个规范且完整的web框架,用于生成.描述.调用可视化的RESTful风格的在线接口文档,并 ...

  4. SpringBoot整合MyBatis-Plus详细使用方法

    SpringBoot整合mp 一.添加依赖pom.xml <dependency> <groupId>mysql</groupId> <artifactId& ...

  5. Spring整合Hibernate详细步骤

    阅读目录 一.概述 二.整合步骤 回到顶部 一.概述 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory 2.让Hibernate使 ...

  6. SpringBoot整合Elastic-job(详细)

    一 作业分片1.分片概念作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项.例如:Elastic-Job快速入门中文件备份的例子,现有 ...

  7. SSH整合的详细步骤

    SSH整合 新建一个动态web工程-->加入Spring-->加入Hibernate-->加入Struts2 1.在 web中应用Spring 目的:在web应用程序加载成功之后,就 ...

  8. SSH三大框架整合配置详细步骤(3)

    5 配置Spring2.5 5.1 基础配置 1)        导入spring包.下载spring-framework-2.5.6并解压后,在spring-framework-2.5.6" ...

  9. 关于springboot整合的详细过程

    Spring-boot http://tengj.top/2017/04/24/springboot0/

  10. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSM(Spring+Spring MVC+MyBatis)框架整合搭建详细步骤

    因为 Spring MVC 是 Spring 框架中的一个子模块,所以 Spring 与 SpringMVC 之间不存在整合的问题.实际上,SSM 框架的整合只涉及 Spring 与 MyBatis ...

随机推荐

  1. Python 中的字符串基础与应用

    在Python中,字符串可以用单引号或双引号括起来.'hello' 与 "hello" 是相同的.您可以使用print()函数显示字符串文字: 示例: print("He ...

  2. 【代码实现】最新PyTorch机器学习与深度学习技术方法

    近年来,随着AlphaGo.无人驾驶汽车.医学影像智慧辅助诊疗.ImageNet竞赛等热点事件的发生,人工智能迎来了新一轮的发展浪潮.尤其是深度学习技术,在许多行业都取得了颠覆性的成果.另外,近年来, ...

  3. openGauss/MogDB调用C FUNCTION

    openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现,通过 contrib 模块进行扩展的帖子,今天和恩墨工程师进行了一些交流,在 M ...

  4. 什么是MurmurHash

    MurmurHash简介 MurmurHash是一种非加密散列函数,名称来自两个基本操作,乘法(MU)和旋转(R).与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的.在2018 ...

  5. 10.1K star !牛逼了!开源技术速查表,推荐人手一份!

    1.前言 在当今信息爆炸的时代,知识的获取.整理和应用显得尤为重要.随着个人职业发展和学习需求的不断提升,搭建一个个人知识库已成为提升竞争力的关键一环.个人知识库不仅是一个信息的存储库,更是一个思维的 ...

  6. node nvm使用

    背景 node 经过了一次大的改变,直接从8到了10,差别很大,但是有的项目又需要用到8,这个时候不能完全升级. 所以我们需要一个管理虚拟环境的工具. 安装 https://github.com/co ...

  7. Memory Error

    不久前,为了满足工作中日常的各种实验测试需求,终于按需求组装一台塔式的server T440.但是没有多久就出现些问题,以下大概是问题和现象简单描述: (1). 最开始时,没几天就出现自动重启的问题, ...

  8. 力扣1620(java&python)-网络信号最好的坐标(中等)

    题目: 给你一个数组 towers 和一个整数 radius . 数组  towers  中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 ...

  9. OceanBase初体验之部署生产标准的三节点分布式集群

    前置条件 OceanBase 数据库集群至少由三个节点组成,所以先准备好3台服务器: IP 配置 操作系统 x.x.x.150 Intel x86 12C 64G内存 1T SSD CentOS 7. ...

  10. App隐私合规“免费”自动化检测

    简介: App隐私合规检测提供了全面的隐私合规检测报告和专家建议,从确保形式合规(隐私政策文本合规性)及实质合规(代码层合规性)的一致性,从个人信息收集.权限使用场景.超范围采集.隐私政策.三方SDK ...