RabbitMQ-Direct交换器

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");
        }
    }
}

接收成功
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值