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的更多相关文章

  1. springboot学习笔记-6 springboot整合RabbitMQ

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  2. 【SpringBoot系列5】SpringBoot整合RabbitMQ

    前言: 因为项目需要用到RabbitMQ,前几天就看了看RabbitMQ的知识,记录下SpringBoot整合RabbitMQ的过程. 给出两个网址: RabbitMQ官方教程:http://www. ...

  3. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

  4. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  5. 【MQ中间件】RabbitMQ -- SpringBoot整合RabbitMQ(3)

    1.前言说明 前面一篇博客中提到了使用原生java代码进行测试RabbitMQ实现多种交换机类型的队列场景.但是在项目中我们一般使用SpringBoot项目,而且RabbitMQ天生对于Spring的 ...

  6. 功能:SpringBoot整合rabbitmq,长篇幅超详细

    SpringBoot整合rabbitMq 一.介绍 消息队列(Message Queue)简称mq,本文将介绍SpringBoot整合rabbitmq的功能使用 队列是一种数据结构,就像排队一样,遵循 ...

  7. springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息

    在上篇文章  springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...

  8. Springboot 整合RabbitMq ,用心看完这一篇就够了

    该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct.Topic.Fanout的使用,消息回调.手动确认等. (但是 ...

  9. RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

随机推荐

  1. java实现第二届蓝桥杯地铁换乘(C++)

    地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...

  2. java实现第四届蓝桥杯猜年龄

    猜年龄 题目描述 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一次,他参加某个重要会议,年轻的脸孔引人注目.于是有人询问他的年龄, ...

  3. VMware15 镜像Centos7修改静态IP

    VMware15 镜像Centos7修改静态IP * 我的网卡名称为ens33: * 配置IP在 /etc/sysconfig/network-scripts/ifcfg-ens33 目录下: * D ...

  4. pyhon的浅拷贝与深拷贝

    1.赋值:简单地拷贝对象的引用,两个对象的id相同. 2.浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象. 3.深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象 ...

  5. 在PyQt5中显示matplotlib绘制的图形

    import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from plot_pyqt import PlotCanva ...

  6. 百度编辑器UEditor不能插入视频的解决方法

    在编辑器中就可以引用优酷.腾讯视频的iframe通用代码和embed html代码:移动端一般引用iframe,可设置属性,使其适应设备.(这里,建议切换到源码模式,插入相应的视频代码embed或if ...

  7. Redis学习笔记(二十) 发布订阅(下)

    当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...

  8. [转] C++中的namespace

    点击阅读原文 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都 ...

  9. maven项目快速搭建SSM框架(一)创建maven项目,SSM框架整合,Spring+Springmvc+Mybatis

    首先了解服务器开发的三层架构,分配相应的任务,这样就能明确目标,根据相应的需求去编写相应的操作. 服务器开发,大致分为三层,分别是: 表现层 业务层 持久层 我们用到的框架分别是Spring+Spri ...

  10. controlfile的情景恢复

    控制文件测试 百度百科:控制文件(Control File)是Oracle的物理文件之一,它记录了数据库的名字.数据文件的位置等信息.控制文件的重要性在于,一旦控制文件损坏,数据库将会宕机.如果没有数 ...