一、核心思路
1、生产者发送消息的时候会携带routing key
2、channel通道中定义Queue、定义Exchange、绑定Queue与Exchange、发布消息
3、交换机通过配置binding key与Queue进行绑定
所以我们需要做一下几件事:
1、连接上rabbitmq
2、新建配置类config:定义Queue、定义Exchange、绑定Queue与Exchange
3、生产者发送消息到队列
4、消费者通过交换机取相应队列中的消息进行消费
二、代码实现
1、引入依赖
<!--消息队列模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、application.yml配置连接上rabbitmq
spring:
rabbitmq:
host: 主机ip
port: 5672
username: guest
password: guest
3、配置类定义Queue、定义Exchange、绑定Queue与Exchange
@Configuration
public class RabbitConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
// 定义一个或多个交换机
public static final String EXCHANGE_A = "my-mq-exchange_A";
// public static final String EXCHANGE_B = "my-mq-exchange_B";
// 定义队列
public static final String QUEUE_A = "QUEUE_A";
// public static final String QUEUE_B = "QUEUE_B
// 定义routing-key
public static final String ROUTING_KEY_A = "spring-boot-routingKey_A";
// public static final String ROUTING_KEY_B = "spring-boot-routingKey_B";
/**
* 针对消费者配置
* 1. 设置交换机类型
* 2. 将队列绑定到交换机
FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念
HeadersExchange :通过添加属性key-value匹配
DirectExchange:按照routingkey分发到指定队列
TopicExchange:多关键字匹配
**/
@Bean
public DirectExchange defaultExchange() {
return new DirectExchange(EXCHANGE_A);
}
/**
* 获取队列A
* @return
*/
@Bean
public Queue queueA() {
return new Queue(QUEUE_A, true); //队列持久
}
// 一个交换机可以绑定多个消息队列,也就是消息通过一个交换机,可以分发到不同的队列当中去。
@Bean
public Binding binding() {
return BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTING_KEY_A);
}
// 创建连接工厂,获取MQ的连接
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost("/");
return connectionFactory;
}
// 创建rabbitTemplate
@Bean(name = "rabbitTemplate")
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
return template;
}
4、生产者
@Component
public class MsgProducer{
@Autowired
private RabbitTemplate rabbitTemplate;
private void sendMsg(String content) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
//把消息放入ROUTING_KEY_A对应的队列当中去,对应的是队列A
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_A, RabbitConfig.ROUTING_KEY_A, content, correlationId);
}
}
5、消费者
Component
@RabbitListener(queues = RabbitConfig.QUEUE_A)
public class MsgReceiver {
@RabbitHandler
public void process(String content) {
System.out.println("接收处理队列A当中的消息: " + content);
}
}
6、测试
@SpringBootTest
class RabbitmqDemoApplicationTests {
@Autowired
private MsgProducer msgProducer;
@Test
public void test(){
msgProducer.sendMsg("hello,this is my msg");
}
}
结果
接收处理队列A当中的消息: hello,this is my msg