RabbitMQ
注意:在整合之前可以先看一下RabbitMQ的基本概念
https://blog.csdn.net/weixin_44259134/article/details/102939723
https://blog.csdn.net/weixin_44259134/article/details/102947621
SpringBoot整合RabbitMQ简单实现步骤
1.添加maven依赖,修改pom.xml。这个spring-boot-starter-amqp里面的amqp指的是高级消息队列协议,而rabbitmq就是amqp协议的一种实现中间件。
<!-- 添加springboot对amqp的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.application.properties修改配置,如果本地没有rabbitmq需要自行安装
#rabbitmq链接地址
spring.rabbitmq.host=ip
spring.rabbitmq.port=端口
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=my_vhost
#开启消费者重试
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重试次数(重试5次还不行则会把消息删掉,默认是不限次数的,次数建议控制在10次以内)
spring.rabbitmq.listener.simple.retry.max-attempts=5
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval=3000
3.创建配置TopicRabbitConfig:主要是创建交换机,创建对列,创建RoutingKey,通过routingKey把队列与交换机绑定起来
@Configuration
public class TopicRabbitConfig {
/**
* @description: 创建配置队列,用来创建其他队列
* 命名规则:A_TO_B_QUEUE A_TO_B_EXCHANGE (A,B分别为系统A和B)
*/
@Value("COLLECT_EXCHANGE_LOCAL")
private String EXCHANGE_NAME; // 交换机名称
@Value("COLLECT_QUEUE_NAME")
private String QUEUE_NAME; // 队列名称
@Value("COLLECT_ROUTING_KEY")
private String ROUTING_KEY; // RoutingKey
/** 创建交换机 */
@Bean
public DirectExchange directExchange() {
return new DirectExchange(EXCHANGE_NAME);
}
/** 创建队列 */
@Bean
public Queue logCollectQueue() {
return new Queue(QUEUE_NAME);
}
/** 通过routingKey把队列与交换机绑定起来 */
@Bean
public Binding binding(DirectExchange exchange, Queue queue) {
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
}
4.创建生产者HelloSender,就是投递消息的一方
生产者创建消息,然后发布到 RabbitMQ 中。消息一般可以包含 2 个部分:消息体和标签 CLabel) 。消息体也可以称之为
payload ,在实际应用中,消 息体 一般是一个带有业务逻辑结构 的数据,比如一个 JSON 字符串。当然可以进一步对这个
消息体进行序列化操作。消息的标签用来表述这条消息,比如一个交换器的名称和一个路由键生产者把消息交由 RabbitMQ ,
RabbitMQ 之后会根据标签把消息发送给感兴趣 的消费者(Consumer)。
@Component
public class HelloSender {
private static Logger logger = Logger.getLogger(HelloSender.class);
@Autowired
private AmqpTemplate template;
@Value("COLLECT_EXCHANGE_LOCAL")
private String EXCHANGE_NAME; //交换机名字
@Value("COLLECT_ROUTING_KEY")
private String ROUTING_KEY; // RoutingKey
@Value("COLLECT_QUEUE_NAME")
private String QUEUE_NAME; // 队列名称
//创建生产者
public void send() {
/*//指定交换机和RoutingKey创建生产者
template.convertAndSend(EXCHANGE_NAME, ROUTING_KEY, "hello,rabbit~");*/
logger.info("创建生产者");
//根据队列名创建生产者
template.convertAndSend(QUEUE_NAME,"hello,rabbitQueueName");
}
}
5.创建消费者HelloReceive ,就是接收消息的 一方
消费者连接到 RabbitMQ 服务器,并订阅到队列上 。 当消费者消费一条消息时 , 只是消费
消息的消息体 C payload ) 。 在消息路由的过程中 , 消息的标签会丢弃 , 存入到队列中的消息只
有消息体,消费者也只会消费到消息体 , 也就不知道消息的生产者是谁,当然消费者也不需要
知道 。
@Component
public class HelloReceive {
private static Logger logger = Logger.getLogger(HelloReceive.class);
//创建消费者,由COLLECT_QUEUE_NAME监听队列
@RabbitListener(queues="COLLECT_QUEUE_NAME")//监听器监听指定的Queue
public void process(String str) {
logger.info("创建消费者,Receive:"+str);
}
}
6.最后创建测试类直接调用生产者
@SpringBootTest(classes= ConsumerServiceApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRabbitMQ {
private static Logger logger = Logger.getLogger(TestRabbitMQ.class);
@Autowired
private HelloSender helloSender;
@Autowired
private HelloSender2 helloSender2;
@Test
public void testRabbit() {
logger.info("start");
helloSender.send();
logger.info("end");
}
}
运行测试方法,成功!