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.应用解耦 ...
随机推荐
- TZOJ 公交车
描述 公交车在一条笔直的道路(道路宽度忽略,设为X轴)上行驶,按顺序路上有若干个站点(X坐标值),crq的家也在道路旁某个位置h(X坐标值),现在crq想知道哪个站点下车离家最近. 输入 输入数据的第 ...
- 【CSS】滚动条样式
/*定义滚动条宽高及背景,宽高分别对应横竖滚动条的尺寸*/ .scrollbar::-webkit-scrollbar{ width: 16px; height: 16px; background-c ...
- vue-cli3.0配置详解
这次给大家带来vue-cli3.0配置详解,使用vue-cli3.0配置的注意事项有哪些,下面就是实战案例,一起来看一下. 新建项目 1 2 3 4 5 6 7 8 # 安装 npm install ...
- CSS清除浮动&内容居中&文字溢出
学习! 1.CSS清除浮动的方法 (1)添加标签清除浮动: 在浮动元素结尾处,并列的添加标签<div style="clear:both;"></div>. ...
- 数据结构&算法
20个最常用.最基础数据结构与算法: 10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie 树. 10个 算法 :递归.排序.二分查找.搜索.哈希.贪心.分治.回溯. ...
- cocos2dx 实现遮罩
参考博文:http://blog.csdn.net/myarrow/article/details/19913653 参考博文:http://blog.csdn.net/song_hui_xiang/ ...
- Centos7.3 搭建KVM 命令安装VM虚拟机
操作系统:centos7.3 一.安装KVM 1. 验证CPU是否支持KVM:如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的. egrep '(vmx|svm)' ...
- 如何使用 Shell 脚本来查看多个服务器的端口是否打开?
我们在进行服务器配置的时候,经常要查看服务器的某个端口是否已经开放.如果服务器只有一两台的话,那很好办,只需要使用 nc 命令一个个查看即可. 但是,如果你的服务器是个集群,有很多台呢?那如果还一个个 ...
- 【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!
写在前面 最近,一位读者出去面试前准备了很久,信心满满的去面试.没想到面试官的一个问题把他难住了.面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很 ...
- C++中为什么按两次ctrl+D才能结束标准I/O
参考资料: https://www.douban.com/group/topic/127062773/ 今天学习了C++语言的标准I/O,也就是std::cin和std::cout,但是我发现当系统在 ...