SpringBoot集成RabbitMQ
1、搭建RabbitMQ环境
需要搭建两个项目
- test-spring-rabbit-product
- test-spring-rabbit-consumer
添加maven坐标
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
</dependencies>
2、配置
2.1 创建配置文件
server:
port: 44000
spring:
rabbitmq:
host: 192.168.174.131
port: 5672
username: guest
password: guest
virtual-host: /
2.2 创建config类
例子中使用的topic队列
package com.rabbit.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author: Yizq
* @data: 2020/10/12 21:11
*/
@Configuration
public class RabbitmqConfig {
public static final String QUEUE_INFORM_EAMIL = "queue_inform_eamil";
public static final String QUEUE_INFORM_SMS = "queue_inform_sms";
public static final String SPRING_EXCHANGE_TOPICS_INFORM = "spring_exchange_topics_inform";
/**
*
* @description: 交换机配置
* @param
* @return: {@link Exchange}
* @author: Yizq
* @data: 2020/10/12 21:17
*/
@Bean(SPRING_EXCHANGE_TOPICS_INFORM)
public Exchange SPRING_EXCHANGE_TOPICS_INFORM() {
// durable(true) 持久化,消息队列重启后交换机依然存在
return ExchangeBuilder.topicExchange(SPRING_EXCHANGE_TOPICS_INFORM).durable(true).build();
}
/**
*
* @description: 声明队列
* @param
* @return: {@link Queue}
* @author: Yizq
* @data: 2020/10/12 21:19
*/
@Bean(QUEUE_INFORM_SMS)
public Queue QUEUE_INFORM_SMS() {
Queue queue = new Queue(QUEUE_INFORM_SMS);
return queue;
}
/**
*
* @description: 声明队列
* @param
* @return: {@link Queue}
* @author: Yizq
* @data: 2020/10/12 21:19
*/
@Bean(QUEUE_INFORM_EAMIL)
public Queue QUEUE_INFORM_EAMIL() {
Queue queue = new Queue(QUEUE_INFORM_EAMIL);
return queue;
}
@Bean
public Binding BINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue, @Qualifier(SPRING_EXCHANGE_TOPICS_INFORM) Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("inform.#.sms.#").noargs();
}
@Bean
public Binding BINDING_QUEUE_INFORM_EMAIL(@Qualifier(QUEUE_INFORM_EAMIL) Queue queue, @Qualifier(SPRING_EXCHANGE_TOPICS_INFORM) Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("inform.#.email.#").noargs();
}
}
以上配置需要在生产端和消费端都需要添加上,理解为双份。
3、生产端
@SpringBootTest
@RunWith(SpringRunner.class)
public class topics_springboot {
@Autowired
RabbitTemplate rabbitTemplate;
@Test
public void dummy() {
for (int i = 0; i < 5; i++) {
String message = "sms email inform to user" + i;
rabbitTemplate.convertAndSend(RabbitmqConfig.SPRING_EXCHANGE_TOPICS_INFORM,"inform.sms.email",message);
System.out.println(message);
}
}
}
4、消费端
package com.rabbit.config;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @author: Yizq
* @data: 2020/10/12 21:29
*/
@Component
public class RaceiveHandler {
// 监听email队列
@RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_EAMIL})
public void receive_email(String msg, Message message, Channel channel) {
System.out.println(msg);
}
// 监听sms队列
@RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_SMS})
public void receive_sms(String msg, Message message, Channel channel) {
System.out.println(msg);
}
}