Direct交换器特点:
各个队列与Direct交换器之间的路由键配置唯一,发送者发送一条消息,只有路由键完全匹配的队列才会接收到消息。
创建消息生产者module:配置交换器名称和路由键信息。消息发送时,需要指定交换器和路由键。
pom.xml导入RabbitMQ坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties配置RabbitMQ信息
#RabbitMQ基本信息
spring.rabbitmq.host=182.61.40.184
spring.rabbitmq.port=5672
spring.rabbitmq.username=rabbitmq
spring.rabbitmq.password=rabbitmq
#自定义配置
#设置交换器名称
spring.rabbitmq.exchange=directExchange
#设置路由键A
spring.rabbitmq.routingkeyA=routingkey.A
#设置路由键B
spring.rabbitmq.routingkeyB=routingkey.B
创建Controller,通过浏览器请求,发送消息到RabbitMQ
@Controller
public class RabbitMQController {
@Autowired
AmqpTemplate amqpTemplat;
@Value("${spring.rabbitmq.exchange}")
String exchangeName; //交换器名称
@Value("${spring.rabbitmq.routingkeyA}")
String routingKeyA; //路由键A
@Value("${spring.rabbitmq.routingkeyB}")
String routingKeyB; //路由键B
@RequestMapping(value="/sendMessageA",method=RequestMethod.GET)
@ResponseBody
public void sendMessA() throws InterruptedException {
String message="Direct A";
int flag=0;
while (true) {
Thread.sleep(1000);
//参数1:交换器 参数2:路由键 参数3:要发送的消息
amqpTemplat.convertAndSend(exchangeName,routingKeyA,message + flag);
flag++;
}
}
@RequestMapping(value="/sendMessageB",method=RequestMethod.GET)
@ResponseBody
public void sendMessB() throws InterruptedException {
String message="Direct B";
while (true) {
Thread.sleep(1000);
//参数1:交换器 参数2:路由键 参数3:要发送的消息
amqpTemplat.convertAndSend(exchangeName,routingKeyB,message);
}
}
}
创建消息消费者module:配置队列名称,交换器名称和类型,路由键信息和它们之间绑定信息,编写队列消息处理组件。
pom.xml导入RabbitMQ坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties配置RabbitMQ信息
#RabbitMQ基本信息
spring.rabbitmq.host=182.61.40.184
spring.rabbitmq.port=5672
spring.rabbitmq.username=rabbitmq
spring.rabbitmq.password=rabbitmq
#自定义配置
#设置交换器名称
spring.rabbitmq.exchange=directExchange
#设置队列A的名称
spring.rabbitmq.queueA=QUEUEA
#设置路由键A
spring.rabbitmq.routingkeyA=routingkey.A
#设置队列B的名称
spring.rabbitmq.queueB=QUEUEB
#设置路由键B
spring.rabbitmq.routingkeyB=routingkey.B
队列A消息处理组件
/**
* @RabbitListener:
* @QueueBinding
* value:指定队列,autoDelete = "true"表示为此队列为临时队列
* exchange:指定交换器,并指定其类型为DIRECT类型
* key:指定此队列和此交换器之间的路由键
*
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value="${spring.rabbitmq.queueA}",autoDelete = "true"),
exchange = @Exchange(value="${spring.rabbitmq.exchange}",type=ExchangeTypes.DIRECT),
key="${spring.rabbitmq.routingkeyA}"
)
)
public class RabbitMQReciveA {
//对接收到的消息进行处理
@RabbitHandler
public void getMessage(String message) {
System.out.println("队列A接收到消息: "+message);
}
}
队列B消息处理组件
/**
* @RabbitListener:
* @QueueBinding
* value:指定队列,autoDelete = "true"表示为此队列为临时队列
* exchange:指定交换器,并指定其类型为DIRECT类型
* key:指定此队列和此交换器之间的路由键
*
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value="${spring.rabbitmq.queueB}",autoDelete = "true"),
exchange = @Exchange(value="${spring.rabbitmq.exchange}",type=ExchangeTypes.DIRECT),
key="${spring.rabbitmq.routingkeyB}"
)
)
public class RabbitMQReciveB {
@RabbitHandler
public void getMessage(String message) {
System.out.println("队列B接收到消息: "+message);
}
}
测试:
启动两个module,访问Controller。