IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Springboot集成rabbitMQ-2 -> 正文阅读

[Java知识库]Springboot集成rabbitMQ-2

springboot集成rabbitMQ2

上篇文章,用springboot的默认配置,完成了rabbitMQ消息的发送,但是缺点也很明显,就是需要事先在管理页面创建好对应的Exchange和Queue以及Binding关系。但是其实rabbitMQ可以在发送的时候进行检查,如不存在,则创建。这个就需要结合@Configration和@@Bean进行配置

rabbitMQ自定义配置

通过config文件进行配置

依然按照之前的配置,使用topic交换机,交换机名字叫做 config_exchange,并且使用名叫 test.topic的队列,使用*.b.*进行binding。则相关代码如下:

@Configuration
public class RabbitMQConfig {
    //参数可以放在环境变量中
    @Bean
    public Queue createQueue() {
        Queue msgQueue = new Queue("test.topic", true);
        return msgQueue;
    }

    @Bean
    public TopicExchange createExchange() {
        //这三个参数,分别是 交换机名称,是否持久化,以及是否自动删除
        TopicExchange topicExchange = new TopicExchange("config_exchange", true, false);
        return topicExchange;
    }
    
    @Bean
    public Binding createBinding() {
        return BindingBuilder.bind(createQueue()).to(createExchange()).with("*.b.*");
    }
}

生产者代码编写

上述代码完成了对rabbitmq基本信息的声明,然后就可以向消息队列发送消息了,如果消息队列中不存在,则会创建对应的交换机、queue,并通过路由键进行绑定。

@Test
    public void testMQ() {
        rabbitTemplate.setExchange("config_exchange");
        rabbitTemplate.setRoutingKey("a.b.c");
        for (int i = 0; i < 10000; i++) {
            rabbitTemplate.convertAndSend("发送消息" + i);
        }
    }

可以看到交换机,队列以及绑定关系都正确,并且消息成功送达了。
在这里插入图片描述


消息送达确认

虽然消息发送成功了,但是我们并不能看到相关的日志和信息表示发送的消息已经送达到rabbitMQ服务器。那么如何开启消息送达确认呢?在rabbitMQTemplate中,有setConfirmCallback(),通过这个可以指定一个回调函数,在消息送达后,执行回调函数,我们可以在回调函数中打印日志,或者做其他操作。

配置代码:

 @Bean
    public RabbitTemplate createRabbitMq() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            if (ack) {
                log.info(correlationData.getId() + "发送成功");
            } else {
                log.info("消息发送失败");
            }
        });
        return rabbitTemplate;
    }

这里我们人为创建并且返回了一个rabbitTemplate,并且指定了ConfirmCallbback回调函数。这三个参数分别是correlationData(在发送消息时随消息指定,这样,回调中就可以知道是哪条消息),ack 表示送达状态,如果是true,则表示送达成功,否则,则送达失败,同时错误原因在第三个参数 cause中。

生产者代码

@Test
    public void testMQ() {
        for (int i = 0; i < 10000; i++) {
            rabbitTemplate.convertAndSend("config_exchange", "a.b.c", "发送消息" + i, new CorrelationData(String.valueOf(i)));
        }
    }

这里我们简单的随着消息新建了一个CorrelationData,并且传入了当前消息的id;只所以用四个参数的发送方法,是因为只有这种方法可以指定对应的交换机,路由键以及CorrelationData。(可以点进去简单看下源码)。
最终的效果如下:


2022-09-22 22:22:41.530  INFO 71421 --- [nectionFactory4] c.t.s.config.RabbitMQConfig              : 5119发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [ectionFactory18] c.t.s.config.RabbitMQConfig              : 5125发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [nectionFactory8] c.t.s.config.RabbitMQConfig              : 5129发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [ectionFactory20] c.t.s.config.RabbitMQConfig              : 5117发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [nectionFactory9] c.t.s.config.RabbitMQConfig              : 5120发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [nectionFactory1] c.t.s.config.RabbitMQConfig              : 5123发送成功
2022-09-22 22:22:41.530  INFO 71421 --- [nectionFactory7] c.t.s.config.RabbitMQConfig              : 5116发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [nectionFactory9] c.t.s.config.RabbitMQConfig              : 5135发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [ectionFactory20] c.t.s.config.RabbitMQConfig              : 5136发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [ectionFactory18] c.t.s.config.RabbitMQConfig              : 5138发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [nectionFactory1] c.t.s.config.RabbitMQConfig              : 5140发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [nectionFactory9] c.t.s.config.RabbitMQConfig              : 5132发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [ectionFactory20] c.t.s.config.RabbitMQConfig              : 5130发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [nectionFactory8] c.t.s.config.RabbitMQConfig              : 5131发送成功
2022-09-22 22:22:41.534  INFO 71421 --- [nectionFactory4] c.t.s.config.RabbitMQConfig              : 5134发送成功

总结:通过编写config文件,实现了在代码中配置交换机,队列,已经对应的绑定关系,并且实现了生产者的送达确认。其实实现方式不仅有这一种方式,还可以通过设置ConnectFactory的方式进行配置。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:42:45  更:2022-09-24 20:46:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:10:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码