SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ _weixin_33827590的博客-程序员宅基地

技术标签: java  运维  大数据  

这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息。我将构建一个springboot工程,通过RabbitTemplate去通过MessageListenerAdapter去订阅一个POJO类型的消息。

准备工作

15min
IDEA
maven 3.0

在开始构建项目之前,机器需要安装rabbitmq,你可以去官网下载,http://www.rabbitmq.com/downl... ,如果你是用的Mac(程序员都应该用mac吧),你可以这样下载:

brew install rabbitmq

安装完成后开启服务器:

rabbitmq-server

开启服务器成功,你可以看到以下信息:

    

    RabbitMQ 3.1.3. Copyright (C) 2007-2013 VMware, Inc.
##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
##  ##
##########  Logs: /usr/local/var/log/rabbitmq/[email protected]
######  ##        /usr/local/var/log/rabbitmq/[email protected]
##########
            Starting broker... completed with 6 plugins.

构建工程

构架一个SpringBoot工程,其pom文件依赖加上spring-boot-starter-amqp的起步依赖:

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

创建消息接收者

在任何的消息队列程序中,你需要创建一个消息接收者,用于响应发送的消息。

@Component
public class Receiver {

    private CountDownLatch latch = new CountDownLatch(1);

    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
        latch.countDown();
    }

    public CountDownLatch getLatch() {
        return latch;
    }

}

消息接收者是一个简单的POJO类,它定义了一个方法去接收消息,当你注册它去接收消息,你可以给它取任何的名字。其中,它有CountDownLatch这样的一个类,它是用于告诉发送者消息已经收到了,你不需要在应用程序中具体实现它,只需要latch.countDown()就行了。
创建消息监听,并发送一条消息

在spring程序中,RabbitTemplate提供了发送消息和接收消息的所有方法。你只需简单的配置下就行了:

需要一个消息监听容器
声明一个quene,一个exchange,并且绑定它们
一个组件去发送消息

代码清单如下:

package com.forezp;

import com.forezp.message.Receiver;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;


@SpringBootApplication
public class SpringbootRabbitmqApplication {

     final static String queueName = "spring-boot";

    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange("spring-boot-exchange");
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(queueName);
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
                                             MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }


    public static void main(String[] args) {
        SpringApplication.run(SpringbootRabbitmqApplication.class, args);
    }
}

创建一个测试方法:

@Component
public class Runner implements CommandLineRunner {

    private final RabbitTemplate rabbitTemplate;
    private final Receiver receiver;
    private final ConfigurableApplicationContext context;

    public Runner(Receiver receiver, RabbitTemplate rabbitTemplate,
            ConfigurableApplicationContext context) {
        this.receiver = receiver;
        this.rabbitTemplate = rabbitTemplate;
        this.context = context;
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Sending message...");
        rabbitTemplate.convertAndSend(Application.queueName, "Hello from RabbitMQ!");
        receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
        context.close();
    }

}

启动程序,你会发现控制台打印:

Sending message...
Received <Hello from RabbitMQ!>

总结

恭喜!你刚才已经学会了如何通过spring raabitmq去构建一个消息发送和订阅的程序。 这仅仅是一个好的开始,你可以通过spring-rabbitmq做更多的事,点击这里。

源码下载:https://github.com/forezp/Spr...
参考资料

https://spring.io/guides/gs/m...

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

智能推荐

非安装版mysql_免安装版MySQL(解压版)安装详细教程及注意事项_Coly Li的博客-程序员宅基地

MySQL分为安装版和解压版。为了以后MySQL出问题想重装时的各种不必要的麻烦,我个人推荐解压版MySQL。详细步骤如下:1.下载官网下载网址:https://dev.mysql.com/downloads/mysql/根据你的系统(32位或者64位)选择后缀是ZIP Archive的压缩包下载到本地。点击Dowload后会要求你登录,不用管,直接点击No thanks, just start ..._mysql非安装版安装教程

翻车现场:DefaultSerializer requires a Serializable payload but received an object of type没有序列化报错_煌sir的博客-程序员宅基地

报错:Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but rece_requires a serializable payload but received an object of type

第七期:用云函数快速实现小程序支付_微信小程序支付表结构设计-程序员宅基地

作者:知晓云- 小程序开发快人一步来源:知晓课堂本文主要侧重于讲述小程序在线支付功能中的编程思想和编程模式,并在必要的地方提供关键代码示例。为方便演示,这里将实现一个最简单的虚拟商品的订单支付功能,订单略去了收货地址和多规格、多数量的情况,示例中仅讨论在商品详情页中直接创建订单并发起支付的情况。需要分别定义 Product 表和 Order 表进行数据存取,在 BaaS 后台中创建两张数据表。一、数据表结构设计Product 表:数据表录入权限:所有人数据行读写权限:创建者可写,所有人可读_微信小程序支付表结构设计

React Native打包apk步骤_reactnative打包apk-程序员宅基地

React Native项目如何打包为安卓apk_reactnative打包apk

谷歌浏览器开发者工具 有错误时不显示的问题_谷歌控制台看不到报错-程序员宅基地

随手记,升级以后,发现谷歌浏览器开发者工具的控制台有错时,只报错条数,不显示具体报错信息。原来是我不小心勾选了一项,截图如下:_谷歌控制台看不到报错

JZ2440存储控制器-程序员宅基地

s3c2440的“存储控制器”提供了访问外部设备的信号在JZ2440共有8个bank,每个bank的最大访问容量为128Mbank0~bank5支持外接ROM,SRAMbank6~bank7支持外接ROM,SRAM,SDRAM在外接SDRAM时,支持自刷新,和省电模式S3C2440理论上可寻址4G地址范围,可实际上除了外接的8个bank可最大寻址1G空间外,还有一部分

随便推点

使用二进制免编译包安装MySQL-5.6-程序员宅基地

依赖记录wgetperlnumactl第一步:download$ wget https://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz**第二步:添加用户***$ useradd mysql -s /sbin/nologin -M第三步:安装mysql...

pthread_detach_pthread_create找不到标识符-程序员宅基地

pthread_detach  创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结_pthread_create找不到标识符

Hbase搭建-基于hadoop3--并且解决了hbase error: KeeperErrorCode = NoNode for /hbase/master错误_keepererrorcode = nonode for /hadoop-ha/hacluster/-程序员宅基地

Hbase搭建-基于hadoop31-首先下载Hbase官网下载,点击here咱们下载的是bin下载后上传到hadoop,解压,提取,我这里用的是图形界面,命令行下自行提取。上传可以用sftp或者MobaXterm,MobaXterm里面也是用的sftp。2-修改三个配置文件,配置文件都是在conf下2-2-修改Hbase.env.sh添加jdk路径,把export..._keepererrorcode = nonode for /hadoop-ha/hacluster/activestandbyelectorlock

MySQL8服务无法正常启动的解决方法(1053错误)_管理服务mysql8无法启动_w36680130的博客-程序员宅基地

MySQL8服务无法正常启动的解决方法(1053错误)_管理服务mysql8无法启动

YottaChain泛圈芝麻云节点专业打造区块链数据安全存储库_v:wongwingkan-程序员宅基地

去中心化的区块链存储已经成为存储技术的未来发展趋势。只有去中心化才能消除瓶颈进一步提高可靠性,这和历史上从桌面存储、企业级存储到云存储的发展路线是一脉相承的,都是沿着不断加大故障域隔离的力度和增强冗余性的技术路线来不断提高存储可靠性的。存储也是区块链的最佳商业落地应用场景。一是存储自身有去中心化需求。二是用户越多,去重的放大效应越高。三是区块链激励矿工加入,能够更好的激励用户使用。四是存储数字..._v:wongwingkan

Jenkins的Credentials(证书)管理_credentials电报怎么填写-程序员宅基地

Jenkins的“Credentials”直译为“证书”,“文凭”在这里,尽管说Jenkins界面中有相当一部分的文字经过了官方汉化,但是对于这个“Credentials”却仍然没有被汉化,可见对于其汉化之后对应的中文翻译,官方也是一脸懵逼的状态,在这里,我们可以把它直译为“证书”,如果通过意译,那它的理解就是“钥匙”,这个翻译对于我们而言是最为容易理解的。_credentials电报怎么填写

推荐文章

热门文章

相关标签