SpringBoot集成RabbitMQ_SunAlwaysOnline的博客-程序员宅基地_springboot集成rabbitmq

技术标签: JAVA  RabbitMQ  SpringBoot  SpringBoot实践  

容器化运行RabbitMQ,可以参考我之前的一篇文章容器化运行RabbitMQ

本篇不讲解RabbitMQ的理论知识,均采用最简配置


那么消息队列,需要一个消息的生产者与消费者

创建一个生产者:引入相关的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

application中的配置

server:
  port: 8091

spring:
  application:
    name: producer

  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin

生产者的产生的消息,首先是发到交换机上的,再由交换机依据路由键转发到指定的队列上。因此,我们需要

  • 创建一个交换机
  • 创建一个队列
  • 将交换机与队列绑定

实现代码如下:

/**
 * @author qcy
 * @create 2020/08/06 15:57:36
 */
@Configuration
public class MQConfig {

    //交换机名称
    public static final String DIRECT_EXCHANGE_NAME = "directExchange";
    //队列名称
    public static final String DIRECT_QUEUE_NAME = "directQueue";
    //路由键,带有此键的消息,directExchange会将消息转发到directQueue上
    public static final String ROUTING_KEY = "direct";

    //构造名称为directExchange的直连交换机
    @Bean
    public DirectExchange directExchange() {
        //使用最简单的构造函数,指定直连交换机的名称
        return new DirectExchange(DIRECT_EXCHANGE_NAME);
    }

    //构造名称为directQueue的队列
    @Bean
    public Queue queue() {
        //同样适用最简单的构造函数,指定队列的名称
        return new Queue(DIRECT_QUEUE_NAME);
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(directExchange()).with(ROUTING_KEY);
    }
    
}

通过接口产生消息

/**
 * @author qcy
 * @create 2020/08/06 16:07:18
 */
@RestController
public class MQController {

    @Resource
    RabbitTemplate rabbitTemplate;

    @PostMapping("/sendMsg")
    public Map<String, Object> sendMsg(@RequestBody Map<String, Object> map) {
        //将此消息发送到名称为MQConfig.DIRECT_EXCHANGE_NAME的交换机上,路由键是MQConfig.ROUTING_KEY
        //因此该消息,最终会被转发到名称为MQConfig.DIRECT_QUEUE_NAME的队列上
        rabbitTemplate.convertAndSend(MQConfig.DIRECT_EXCHANGE_NAME, MQConfig.ROUTING_KEY, map);
        return map;
    }
}

使用Postman测试

在未发消息前,是没有任何队列与消息的:

调用之后,创建了名称为directQueue的队列,并且其中有一条消息等待消费


现在创建一个消费者

还是需要引入刚才的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

application.yaml和生产者的配置几乎一致

server:
  port: 8092

spring:
  application:
    name: consumer

  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin

消费者只需要接收消息,监听队列即可

/**
 * @author qcy
 * @create 2020/08/06 16:41:14
 */
@Component
@RabbitListener(queues = "directQueue")
public class MQListener {

    @RabbitHandler
    public void handle(Map<String, Object> map) {
        map.forEach((k, v) -> System.out.println("(" + k + "," + v + ")"));
    }
}

启动消费者后,可以看到消费了消息:

队列中的消息数量又变为了0

至此,一个简单的集成就做好了。其实这边交换机的类型不止Direct一种,还有很多种。

下一篇,将会演示如何确认消息。确认机制在一定程度上,可以解决消息丢失的问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33591903/article/details/107841911

智能推荐

Python配置Qt Designer与PyUIC_热心市民付先生的博客-程序员宅基地_python pyuic

Python配置Qt Designer与PyUIC安装pyqt相关包pip install pyqtpip install pyqt5-toolsPyCharm中选择相应的python解释器3. 添加外部工具名称填写自己方便易记得即可,我的名称添加为QTDesigner程序选择designer.exe,位置为当前解释器路径下的Lib\site-packages\pyqt5-tools\designer.exe工作目录为当前项目文件的目录添加选择完毕界面为:确定即可,再次

关于WebSocket_彪彪_的博客-程序员宅基地

原文链接:https://www.liaoxuefeng.com/wiki/1022910821149312/1103303693824096WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器。为什么传统的HTTP协议不能做到WebSocket实现的功能?这是因为HTTP协议是一个请求-响应协议,...

FineUI初学手册_star_2008_的博客-程序员宅基地

女朋友鄙视我原创少...1.下载 进入官方论坛:http://www.fineui.com/bbs/要用到下载源代码和空项目下载http://fineui.codeplex.com/http://fineui.com/bbs/forum.php?mod=viewthread&tid=2123源代码直接下载,注意FineUI版本空项目里下载 对应版本的空项

NSStringDrawingOptions_yinachong的博客-程序员宅基地

NSStringDrawingTruncatesLastVisibleLine:如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。NSStringDrawingUsesLineFragmentOrigin:绘制文本时使用 line fragement or

条件注解@ConditionalOnBean失效原因_zhm_sky的博客-程序员宅基地_conditionalonbean不生效

测试环境(配置类)@Import({User.class,Pet.class})@Configuration(proxyBeanMethods = true)public class MyConfig { @Bean @ConditionalOnBean(name = "cat") public User user(){ return new User("航书", 12); } @Bean("cat") public

一重指针、二重指针做函数参数的深刻分析(虽然很基础,但要深刻理解)_ShenHang_的博客-程序员宅基地

一重指针做函数参数#include&lt;iostream&gt;using namespace std;void change(int *p){ *p = 20; p++; cout &lt;&lt; p &lt;&lt; endl;}int main() { int a = 10; change(&amp;a); cout &lt;&lt; &amp;a &lt;&lt...

随便推点

vassist的安装_kgduu的博客-程序员宅基地

在网上下载vassist安装压缩文件。1、运行VA_X_Setup

全方位讲解VoIP 的原理及技术知识_demon_evil的博客-程序员宅基地_voip工作原理

通过因特网进行语音通信是一个非常复杂的系统工程,其应用面很广,因此涉及的技术也特别多,其中最根本的技术是VoIP (Voice over IP)技术,可以说,因特网语音通信是VoIP技术的一个最典型的、也是最有前景的应用领域。因此在讨论用因特网进行语音通信之前,有必要首先分析VoIP的基本原理,以及VoIP中的相关技术问题。一、VoIP的基本传输过程传统的电话网是以电路交换方式传输语音,所要求的传

安卓设备抓包_Japher的博客-程序员宅基地

命令: adb shell su mount -o remount rw(空格)/  /data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap   

oracle设置core文件大小,Linux的Core文件设置与调试_李daxin的博客-程序员宅基地

一、运行时错误任何人写程序都会出错,正如《C++编程规范》所说,真正可怕的错误不是编译时的错误,而是运行时错误。有的程序可以通过编译, 但在运行时会出现Segment fault(段错误)这通常都是指针错误(一般就是空指针)引起的,或者访问了不能访问的内存(数组越界,系统保护)二、core文件我们不可能用GDB一句一句的去找,真正的英雄都善于使用手中的武器。这就是core file所谓core,就...

redis客户端连接遇到的坑,记录一下_choujulong7459的博客-程序员宅基地

期间出现的错误如下:1.connect timeout2.connect refused3.遗失对主机的连接denied redis is running in protected mode。。。。。。总结处理这些报错的步骤:1.关闭centos防火墙2.修改redis.conf文...