一、简介
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
首先需要下载到rabbitmq 在这里笔者就不介绍下载安装的过程了,可自寻文章也可参考该篇文章
rabbitmq下载安装:https://blog.youkuaiyun.com/lihua5419/article/details/93006834
笔者的安装包:https://pan.baidu.com/s/17G59XbTVzAz63anZUmDK7w
提取码:1234
下载安装后就开始整合吧
二、整合SpringBoot
1.相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. application.yml 配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#信息确认
publisher-confirm-type: correlated #消息有没有到达MQ(会返回一个ack确认码)
publisher-returns: true #消息有没有找到合适的队列
listener:
simple:
acknowledge-mode: manual #手动确认机制
3.手动信息确认回调函数 (ConfirmCallBackHandler)
public class ConfirmCallBackHandler implements RabbitTemplate.ConfirmCallback {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("消息唯一标识:"+correlationData);
System.out.println("确认结果:"+ack);
System.out.println("失败原因:"+cause);
}
}
4. 配置rabbitmq队列交换机(FanoutRabbitConfig)
@Configuration
public class FanoutRabbitConfig {
@Autowired
RabbitTemplate rabbitTemplate;
//一个队列
@Bean
public Queue queueA() {
return new Queue("queue");
}
//一个扇型交换机
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout-Exchange");
}
//队列绑定扇形交换机
@Bean
Binding bindingExchangeA(Queue queueA, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(queueA).to(fanoutExchange);
}
//初始化加载方法,对RabbitTemplate进行配置
@PostConstruct
void rabbitTemplate(){
//消息发送确认,发送到交换器Exchange后触发回调
rabbitTemplate.setConfirmCallback(new ConfirmCallBackHandler());
}
}
5. 生产者(Sender)
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* <p><p/>
*
* @Author: porridge
* @Date:2022/4/2 19:35
*/
@Component
public class Sender {
@Autowired
RabbitTemplate rabbitTemplate;
//生产者
public void sender(String title, String context) {
Map<String, String> map = new HashMap<>();
map.put("title", title);
map.put("context", context);
this.rabbitTemplate.convertAndSend(
//绑定交换机的名字
"fanout-Exchange",
//路由 扇形机无效
"",
//内容
map,
//唯一id
new CorrelationData(UUID.randomUUID().toString())
);
System.out.println("信息发送成功");
System.out.println("**************************");
}
}
6. 消费者(Listener)
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
/**
* <p><p/>
*
* @Author: porridge
* @Date:2022/4/2 19:51
*/
@Component
public class Listener {
//消费者
@RabbitListener(queues = "queue")
@RabbitHandler
public void process(Map<String, String> map, Channel channel, Message message) throws IOException {
String title = map.get("title");
String context = map.get("context");
System.out.println("正在消费的内容为:" + title + "," + context);
//手动确认信息
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
System.out.println("***********");
System.out.println("消费者消费完的内容为:" + title + "," + context);
System.out.println("手动确认消费完毕!");
}
}
4.测试
@SpringBootTest
class SpringbootRabbitmqApplicationTests {
@Autowired
Sender sender;
@Test
void Sender() {
sender.sender("优快云——porridge","hello word");
}
}
测试结果