03.springboot 整合RabbitMQ
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置生成的消息队列
spring:
rabbitmq:
host: 47.113.120.XX
port: 5672
password: XXXX
username: XXXX
virtual-host: XXX
# rabbitmq 初始化配置
rabbit-init:
list:
- {exchange: "cs.user.topic",queues: [user.permission] , bindingKey: '#.permission', type: topic }
3.配置类
@ConfigurationProperties("rabbit-init")
@Data
public class RabbitMQInitProperty {
private List<RabbitEntity> list = new ArrayList<>();
}
4.RabbitMqConfig类
@Configuration
@Component
@Slf4j
public class RabbitMQConfig implements RabbitListenerConfigurer {
/**
* 回调函数: confirm确认
*/
final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
log.info("消息发送成功:correlationData({}),ack({}),cause({})", correlationData, ack, cause);
if(!ack){
//可以进行日志记录、异常处理、补偿处理等
System.err.println("异常处理...."+cause);
}else {
//更新数据库,可靠性投递机制
}
}
};
/**
* 回调函数: return返回
*/
public final RabbitTemplate.ReturnCallback returnCallback = new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey) {
System.err.println("return exchange: " + exchange + ", routingKey: "
+ routingKey + ", replyCode: " + replyCode + ", replyText: " + replyText);
}
};
/**
* rabbitmq 初始配置
*/
@Autowired
private RabbitMQInitProperty property ;
/**
*
*/
@Autowired
private ConnectionFactory connectionFactory;
/**
* 增加rabbitTemplate回调函数
*/
@Bean
public RabbitTemplate rabbitTemplate(){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setConfirmCallback(confirmCallback);
rabbitTemplate.setConfirmCallback(confirmCallback);
return rabbitTemplate;
}
/**
*
* @return
*/
@Bean
public RabbitAdmin rabbitAdmin(){
return new RabbitAdmin(rabbitTemplate());
}
/**
* 初始化消息队列
* @param rabbitAdmin
* @return
*/
@Bean
public RabbitMQInitProperty getRabbitMQProperty(RabbitAdmin rabbitAdmin){
List<RabbitEntity> list = property.getList();
if(StringUtils.isEmpty(list)) {
return null ;
}
list.stream().forEach(entity -> {
List<String> queues = entity.getQueues();
String binding = entity.getBindingKey();
String exchange = entity.getExchange();
String type = !StringUtils.isEmpty(entity.getType())? entity.getType() : ExchangeTypes.DIRECT;
if(StringUtils.isEmpty(queues) || StringUtils.isEmpty(binding)
|| StringUtils.isEmpty(exchange)
|| StringUtils.isEmpty(type)){
return;
}
Exchange exchangeTempt= new ExchangeBuilder(exchange, type).durable(true).build();
rabbitAdmin.declareExchange(exchangeTempt);
for(String str : queues){
Queue queue = QueueBuilder.durable(str).build();
rabbitAdmin.declareQueue(queue);
Binding bind = BindingBuilder.bind(queue).to(exchangeTempt).with(binding).noargs();
rabbitAdmin.declareBinding(bind);
}
});
return this.property ;
}
/**
* 对象数据格式化
* @return
*/
@Bean
public MessageConverter messagetConverter() {
MessageConverter converter = new Jackson2JsonMessageConverter();
return converter;
}
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
}
}
5.RabbitMQ 发送进行封装
public class RabbitSender {
/**
* 自动注入RabbitTemplate模板类
*/
@Autowired
private RabbitTemplate rabbitTemplate;
/**
*
* @return
*/
private CorrelationData getCorrelation(){
return new CorrelationData(UUID.randomUUID().toString().replace("-", ""));
}
/**
*
* @param exchange
* @param routingKey
* @param message
*/
public void convertAndSend(String exchange,String routingKey, Object message){
CorrelationData correlation = getCorrelation();
log.info("correlation:{},exchange:{},routekey:{},params:{}",correlation.toString(),exchange,
routingKey,message.toString());
rabbitTemplate.convertAndSend(exchange, routingKey, message, correlation);
}
/**
*
* @param entity
*/
public void convertAndSend(RabbitSenderEntity entity) {
CorrelationData correlation = getCorrelation();
log.info("correlation:{},exchange:{},routekey:{},params:{}",correlation.toString(),entity.getExchange(),
entity.getRouteKey(),entity.getParams());
rabbitTemplate.convertAndSend(entity.getExchange(), entity.getRouteKey(), entity.getParams(), correlation);
}
}
6.测试使用
@RequestMapping("/setUserPermission")
public ResultObj setUserPermission(@RequestBody UserInfo user){
try {
Assert.notNull(user);
RabbitSenderEntity entity = RabbitSenderEntity.builder()
.exchange("cs.user.topic")
.routeKey("user.permission")
.params(JsonMapperUtil.toString(user)).build();
sender.convertAndSend(entity);
} catch (Exception e) {
log.error(e.getMessage());
return ResultObj.failObj(e.getMessage());
}
return ResultObj.successObj("权限设置成功");
}
@RabbitListener(queues="user.permission")
public void setUserPermission(Message message, Channel channel) throws IOException {
try {
UserInfo user = RabbitUtil.getMessageBody(message, UserInfo.class);
userInfoService.updateById(user);
} catch (IOException e) {
log.error("消费方法{},爆出错误信息:{}","setUserPermission",e.getMessage());
} finally {
//告诉MQ删除这一条消息,若是true,则是删除所有小于tags的消息
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}
03.springboot 整合RabbitMQ的更多相关文章
- springboot学习笔记-6 springboot整合RabbitMQ
一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...
- 【SpringBoot系列5】SpringBoot整合RabbitMQ
前言: 因为项目需要用到RabbitMQ,前几天就看了看RabbitMQ的知识,记录下SpringBoot整合RabbitMQ的过程. 给出两个网址: RabbitMQ官方教程:http://www. ...
- SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...
- 一篇学习完rabbitmq基础知识,springboot整合rabbitmq
一 rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...
- 【MQ中间件】RabbitMQ -- SpringBoot整合RabbitMQ(3)
1.前言说明 前面一篇博客中提到了使用原生java代码进行测试RabbitMQ实现多种交换机类型的队列场景.但是在项目中我们一般使用SpringBoot项目,而且RabbitMQ天生对于Spring的 ...
- 功能:SpringBoot整合rabbitmq,长篇幅超详细
SpringBoot整合rabbitMq 一.介绍 消息队列(Message Queue)简称mq,本文将介绍SpringBoot整合rabbitmq的功能使用 队列是一种数据结构,就像排队一样,遵循 ...
- springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
在上篇文章 springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...
- Springboot 整合RabbitMq ,用心看完这一篇就够了
该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct.Topic.Fanout的使用,消息回调.手动确认等. (但是 ...
- RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)
1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...
随机推荐
- JPA入门及深入
一:ORM介绍 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...
- STL关联容器
这里简单学习一下STL关联容器,主要是map.multimap.set.multiset以及unordered_map.前四个底层实现都是利用红黑树实现的,查找算法时间复杂度为\(O(log(n))\ ...
- Jquery封装:下拉框插件
代码如下: ;(function ($, window) { $.fn.addSelect = function (options) { //合并传入与默认的参数 var opts = $.exten ...
- nginx介绍及其原理
nginx介绍及其原理 nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行. nginx由俄罗斯程序设计师lgor Sy ...
- Clear Writer v1.8 更新
拖更了这么久之后,Clear Writer 诈尸啦(bushi 下载链接:https://linhongping.lanzous.com/ikF2Udmf7if Clear Writer v1.8 更 ...
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- 初识Redis的数据类型HyperLogLog
前提 未来一段时间开发的项目或者需求会大量使用到Redis,趁着这段时间业务并不太繁忙,抽点时间预习和复习Redis的相关内容.刚好看到博客下面的UV和PV统计,想到了最近看书里面提到的HyperLo ...
- vue+ajax的实现
html <tr> <td>用户名</td> <td id="t01"><input type="text" ...
- ca75a_c++_标准IO库-利用流对象把文件内容读取到向量-操作文件
/*ca75a_c++_标准IO库习题练习习题8.3,8.4,8.6习题8.9.8.10 ifstream inFile(fileName.c_str());1>d:\users\txwtech ...
- Cookie的简介与使用
Cookie 历来指就着牛奶一起吃的点心.然而,在因特网内,"Cookie"这个字有了完全不同的意思.那么"Cookie"到底是什么呢?"Cookie ...