Direct 交换器(发布与订阅 完全匹配)
RabbitMQ的exchange模式有:fanout(路由器模式)、direct(指定模式,RabbitMQ的默认模式)、topic(主题)、headers(不常用)。
direct模式:指定exchange为direct,发送者发送消息时设置routing_key(路由键),消费者绑定exchange并指定bing_key与消息的routing_key相同,此时消息发送到交换器,消费者绑定的queue接收到消息,再由routing_key决定哪个消费者消费消息,没有对应的routing_key则消息丢失。
消费者根据设置的binding_key(绑定键)来选择性的接收自身业务关心的massage。
需求:
1.微服务生产日志交个的日志服务器进行处理
2.日志处理服务器2个,分别info,error
3.服务直接的通讯采用direct(发布订阅)
Direct交换器,在进行消息的发送的时候采用的使用完全匹配的方式在,只有具有想同的交换器和路由键才能触发监听器方法的执行完成业务。
Consumer端配置
1.全局配置文件内的信息
spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.application.name=04-rabbitmq-direct-consumer
#下面的信息为手动配置
#配置交换器的名称
spring.rabbitmq.exchange.name=log-direct
#配置info队列名称
spring.rabbitmq.queue.info.name=info-direct-queue
#配置info日志的路由
spring.rabbitmq.queue.info.key=log.info.routing.key
#配置error日志队列名称
spring.rabbitmq.queue.error.name=error-direct-queue
#配置error队列的路由值
spring.rabbitmq.queue.error.key=log.error.routing.key
2.创建InfoQueue,进行info级别队列的处理
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${spring.rabbitmq.queue.info.name}", autoDelete = "true"),
exchange = @Exchange(value = "${spring.rabbitmq.exchange.name}", type = ExchangeTypes.DIRECT),
key = "${spring.rabbitmq.queue.info.key}"
)
)
public class InfoQueue {
@RabbitHandler
public void info(String msg) {
System.out.println("info......" + msg);
}
}
3.创建ErrorQueue对Error队列的信息进行处理
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${spring.rabbitmq.queue.error.name}", autoDelete = "true"),
exchange = @Exchange(value = "${spring.rabbitmq.exchange.name}", type = ExchangeTypes.DIRECT),
key = "${spring.rabbitmq.queue.error.key}"
)
)
public class ErrorQueue {
@RabbitHandler
public void info(String msg) {
System.out.println("error......" + msg);
}
}
provider消费端的编写
全局文件
1.需要知道交换器的名称注意和服务端的交换器名称要一致
2.要知道路由键的值
spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.application.name=05-rabbitmq-direct-provider
#配置交换器的名称
spring.rabbitmq.exchange.name=log-direct
#配置info日志的路由
spring.rabbitmq.queue.info.key=log.info.routing.key
#配置error队列的路由值
spring.rabbitmq.queue.error.key=log.error.routing.key
2.发送类
1.发送类需要根据交换器的名称和路由键进行消息的发送
@Component
public class Send {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 设置交换器的名称
*/
@Value(value = "${spring.rabbitmq.exchange.name}")
private String exchange;
/**
* 设置发送的key
*/
@Value(value = "${spring.rabbitmq.queue.error.key}")
private String key;
public void send(String msg){
/**
* 参数:
* 1.设置发送的交换器名称
* 2.设置key值
* 3.发送的信息
*/
this.rabbitTemplate.convertAndSend(exchange,key,msg);
}
}
3.测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTests {
@Autowired
private Send send;
@Test
public void contextLoads() throws InterruptedException {
while (true){
Thread.sleep(1000);
this.send.send("info");
}
}
}
接收成功