RabbitMQ作为AMQP的代表性产品,在项目中大量使用。结合现在主流的spring boot,极大简化了开发过程中所涉及到的消息通信问题。

首先正确的安装RabbitMQ及运行正常。
RabbitMQ需啊erlang环境,所以首先安装对应版本的erlang,可在RabbitMQ官网下载
# rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm
使用yum安装RabbitMQ,避免缺少依赖包引起的安装失败
# yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm
启动RabbitMQ
# /sbin/service rabbitmq-server start
由于RabbitMQ默认提供的guest用户只能本地访问,所以额外创建用户用于测试
# /sbin/rabbitmqctl add_user test test123 用户名:test,密码:test123
开启web管理插件
# rabbitmq-plugins enable rabbitmq_management
并使用之前创建的用户登录,并设置该用户为administrator,虚拟主机地址为/
spring boot 引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
消息生产者
application.properties添加一下配置
spring.rabbitmq.host=192.168.1.107 spring.rabbitmq.port=5672 spring.rabbitmq.username=test spring.rabbitmq.password=test123 spring.rabbitmq.publisher-confirms=true spring.rabbitmq.publisher-returns=true spring.rabbitmq.template.mandatory=true
spring boot配置类,作用为指定队列,交换器类型及绑定操作
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
//声明队列
@Bean
public Queue queue1() {
return new Queue("hello.queue1", true); // true表示持久化该队列
}
@Bean
public Queue queue2() {
return new Queue("hello.queue2", true);
}
//声明交互器
@Bean
TopicExchange topicExchange() {
return new TopicExchange("topicExchange");
}
//绑定
@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(topicExchange()).with("key.1");
}
@Bean
public Binding binding2() {
return BindingBuilder.bind(queue2()).to(topicExchange()).with("key.#");
}
}
共声明了2个队列,分别是hello.queue1,hello.queue2,交换器类型为TopicExchange,并与hello.queue1,hello.queue2队列分别绑定。
生产者类
import java.util.UUID;
import javax.annotation.PostConstruct;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Sender implements RabbitTemplate.ConfirmCallback, ReturnCallback {
@Autowired
private RabbitTemplate rabbitTemplate;
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback(this);
rabbitTemplate.setReturnCallback(this);
}
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
System.out.println("消息发送成功:" + correlationData);
} else {
System.out.println("消息发送失败:" + cause);
}
}
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println(message.getMessageProperties().getCorrelationIdString() + " 发送失败");
}
//发送消息,不需要实现任何接口,供外部调用。
public void send(String msg){
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
System.out.println("开始发送消息 : " + msg.toLowerCase());
String response = rabbitTemplate.convertSendAndReceive("topicExchange", "key.1", msg, correlationId).toString();
System.out.println("结束发送消息 : " + msg.toLowerCase());
System.out.println("消费者响应 : " + response + " 消息处理完成");
}
}
要点:
1.注入RabbitTemplate
2.实现RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback接口(非必须)。
ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后接收ack回调。ReturnCallback接口用于实现消息发送到RabbitMQ交换器,但无相应队列与交换器绑定时的回调。
3.实现消息发送方法。调用rabbitTemplate相应的方法即可。rabbitTemplate常用发送方法有
rabbitTemplate.send(message); //发消息,参数类型为org.springframework.amqp.core.Message rabbitTemplate.convertAndSend(object); //转换并发送消息。 将参数对象转换为org.springframework.amqp.core.Message后发送 rabbitTemplate.convertSendAndReceive(message) //转换并发送消息,且等待消息者返回响应消息。
针对业务场景选择合适的消息发送方式即可。
消息消费者
application.properties添加一下配置
spring.rabbitmq.host=192.168.1.107 spring.rabbitmq.port=5672 spring.rabbitmq.username=test spring.rabbitmq.password=test123 spring.rabbitmq.listener.concurrency=2 //最小消息监听线程数 spring.rabbitmq.listener.max-concurrency=2 //最大消息监听线程数
消费者类
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class Receiver {
@RabbitListener(queues = "hello.queue1")
public String processMessage1(String msg) {
System.out.println(Thread.currentThread().getName() + " 接收到来自hello.queue1队列的消息:" + msg);
return msg.toUpperCase();
}
@RabbitListener(queues = "hello.queue2")
public void processMessage2(String msg) {
System.out.println(Thread.currentThread().getName() + " 接收到来自hello.queue2队列的消息:" + msg);
}
}
由于定义了2个队列,所以分别定义不同的监听器监听不同的队列。由于最小消息监听线程数和最大消息监听线程数都是2,所以每个监听器各有2个线程实现监听功能。
要点:
1.监听器参数类型与消息实际类型匹配。在生产者中发送的消息实际类型是String,所以这里监听器参数类型也是String。
2.如果监听器需要有响应返回给生产者,直接在监听方法中return即可。
运行测试
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.sam.demo.rabbitmq.Application;
import com.sam.demo.rabbitmq.sender.Sender;
@RunWith(value=SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class RabbitTests {
@Autowired
private Sender sender;
@Test
public void sendTest() throws Exception {
while(true){
String msg = new Date().toString();
sender.send(msg);
Thread.sleep(1000);
}
}
}
输出:
开始发送消息 : wed mar 29 23:20:52 cst 2017 SimpleAsyncTaskExecutor-1 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:52 CST 2017 SimpleAsyncTaskExecutor-2 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:52 CST 2017 结束发送消息 : wed mar 29 23:20:52 cst 2017 消费者响应 : WED MAR 29 23:20:52 CST 2017 消息处理完成 ------------------------------------------------ 消息发送成功:CorrelationData [id=340d14e6-cfcc-4653-9f95-29b37d50f886] 开始发送消息 : wed mar 29 23:20:53 cst 2017 SimpleAsyncTaskExecutor-1 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:53 CST 2017 SimpleAsyncTaskExecutor-2 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:53 CST 2017 结束发送消息 : wed mar 29 23:20:53 cst 2017 消费者响应 : WED MAR 29 23:20:53 CST 2017 消息处理完成 ------------------------------------------------ 消息发送成功:CorrelationData [id=e4e01f89-d0d4-405e-80f0-85bb20258f34] 开始发送消息 : wed mar 29 23:20:54 cst 2017 SimpleAsyncTaskExecutor-2 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:54 CST 2017 SimpleAsyncTaskExecutor-1 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:54 CST 2017 结束发送消息 : wed mar 29 23:20:54 cst 2017 消费者响应 : WED MAR 29 23:20:54 CST 2017 消息处理完成 ------------------------------------------------
如果需要使用的其他的交换器类型,spring中都已提供实现,所有的交换器均实现org.springframework.amqp.core.AbstractExchange接口。
常用交换器类型如下:
Direct(DirectExchange):direct 类型的行为是"先匹配, 再投送". 即在绑定时设定一个 routing_key, 消息的routing_key完全匹配时, 才会被交换器投送到绑定的队列中去。
Topic(TopicExchange):按规则转发消息(最灵活)。
Headers(HeadersExchange):设置header attribute参数类型的交换机。
Fanout(FanoutExchange):转发消息到所有绑定队列。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot集成RabbitMQ
# springboot
# RabbitMQ
# RabbitMQ 3.9.7 镜像模式集群与Springboot 2.5.5 整合
# SpringAMQP消息队列(SpringBoot集成RabbitMQ方式)
# 一文掌握Springboot集成RabbitMQ的方法
# springboot2.5.6集成RabbitMq实现Topic主题模式(推荐)
# Springboot集成RabbitMQ死信队列的实现
# SpringBoot集成RabbitMQ的方法(死信队列)
# springboot2.0集成rabbitmq的示例代码
# Spring Boot系列教程之7步集成RabbitMQ的方法
# springboot集成rabbitMQ之对象传输的方法
# spring boot集成rabbitmq的实例教程
# Spring Boot 3 集成 RabbitMQ 
# 发送消息
# 交换器
# 绑定
# 发送到
# 回调
# 都是
# 不需要
# 才会
# 其他的
# 可在
# 各有
# 中去
# 都已
# 涉及到
# 并与
# 该用户
# 转换为
# 用户登录
# 即在
# 官网
相关文章:
如何通过云梦建站系统实现SEO快速优化?
北京网站制作网页,网站升级改版需要多久?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何选择香港主机高效搭建外贸独立站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何在IIS7上新建站点并设置安全权限?
如何通过FTP服务器快速搭建网站?
网站代码制作软件有哪些,如何生成自己网站的代码?
Android自定义listview布局实现上拉加载下拉刷新功能
PHP 500报错的快速解决方法
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
建站主机是什么?如何选择适合的建站主机?
建站之星如何实现五合一智能建站与营销推广?
相册网站制作软件,图片上的网址怎么复制?
,网页ppt怎么弄成自己的ppt?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何基于PHP生成高效IDC网络公司建站源码?
建站10G流量真的够用吗?如何应对访问高峰?
如何快速搭建自助建站会员专属系统?
如何在Golang中使用replace替换模块_指定本地或远程路径
网站制作话术技巧,网站推广做的好怎么话术?
如何选择高效便捷的WAP商城建站系统?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
视频网站制作教程,怎么样制作优酷网的小视频?
如何选择适合PHP云建站的开源框架?
如何在景安云服务器上绑定域名并配置虚拟主机?
一键网站制作软件,义乌购一件代发流程?
如何选择网络建站服务器?高效建站必看指南
建站主机与服务器功能差异如何区分?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何用wdcp快速搭建高效网站?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何选择建站程序?包含哪些必备功能与类型?
网站制作免费,什么网站能看正片电影?
公司网站的制作公司,企业网站制作基本流程有哪些?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何设计高效校园网站?
建站之星2.7模板快速切换与批量管理功能操作指南
零服务器AI建站解决方案:快速部署与云端平台低成本实践
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星备案是否影响网站上线时间?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何挑选高效建站主机与优质域名?
如何通过cPanel快速搭建网站?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
图册素材网站设计制作软件,图册的导出方式有几种?
*请认真填写需求信息,我们会在24小时内与您取得联系。