RabbitMQ --- topic

上一篇文章使用的是直连交换机,她还是不够灵活变通,不能基于多标准进行路由设定。

主题换件机 exchange topic 可以帮助我们解决这个问题。

主题交流

发送到 主题交换机的消息不能具有任意的 routingKey ,他必须由点分隔的单词列表,单词可以是任何内容,但通过他们指定与消息相关的一些功能。路由秘钥中可以包含任意数量的单词,最多可达到255个字节。
绑定秘钥也必须采取相同的形式,主题交换机背后的逻辑类似于 直连交换机。使用特定路由秘钥发送的消息将被传递到与匹配绑定秘钥绑定的所有队列。

绑定键有两个重要的特殊情况:* 星号,可以代替一个单词,# 井号可以替换零个或多个单词。
举个例子!

在这里插入图片描述
在这例子中,我们将发送所有描述动物的消息。消息将与包含三个单词(两个点)的路由键一起发送,路由键中的第一个单词将描述速度,第二个将描述颜色,第三个将描述物种:speed.color.species
我们创建了三个绑定:Q1绑定了 绑定秘钥为:.orange. ,Q2绑定了 绑定秘钥为:..rabbit 和 lazy.#
这些绑定可以概括为:
Q1对所有橙色的动物感兴趣
Q2对兔子的一切感兴趣,以及懒惰动物的一切。

路由秘钥设置为“ quick.orange.rabbit ”的消息将传递到两个队列去。
路由秘钥设置为“ lazy.orange.elephant ”的消息也将会传递到两个队列去。
路由秘钥设置为“ quick.orange.fox ”的消息会传递到第一个Q1的队列去。
路由秘钥设置为“ lazy.brown.fox ”的消息会传到第二个Q2的队列去。
路由秘钥设置为“ lazy.pink.rabbit ”的消息也会传递到第二个Q2的队列去,即使它匹配了两个绑定。
路由秘钥设置为“ quick.brown.fox ”的消息不匹配任何绑定,它将被丢弃。
另一个路由秘钥设置为“ quick.orange.maie.rabbit ”的消息,也将会被丢弃。
路由秘钥设置为“ lazy.orange.maie.rabbit”,及时他有4个单词,也会匹配上Q2对列的绑定。

贴代码
生产者代码
public class TopicsSend {
    final static String EXCHANGE_NAME = "Topics_test";
    static ConnectionUtil connUtil = new ConnectionUtil();
    public static void main(String[] args) throws Exception {
        Connection conn = connUtil.getConn();
        Channel channel = conn.createChannel();
        //声明交换机 指定direct直连类型
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        
        String message1 = "Exchange type topic, test error.test.info";
        String severity = "error.test.info";
        //发布到交换机
        channel.basicPublish(EXCHANGE_NAME, severity, null, message1.getBytes());
        System.out.println("绑定秘钥:"+severity+", 消息:"+message1);

        String message2 = "Exchange type topic, test info.test.action";
        String severity2 = "info.test.action";
        //发布到交换机
        channel.basicPublish(EXCHANGE_NAME, severity2, null, message2.getBytes());
        System.out.println("绑定秘钥:"+severity2+", 消息:"+message2);

        String message3 = "Exchange type topic, test warning.info.action";
        String severity3 = "warning.info.action";
        //发布到交换机
        channel.basicPublish(EXCHANGE_NAME, severity3, null, message3.getBytes());
        System.out.println("绑定秘钥:"+severity3+", 消息:"+message3);

        // 关闭通道和连接
        channel.close();
        conn.close();
    }
}
消费者 *.test.*代码
public class TopicsReceiver {
    final static String EXCHANGE_NAME = "Topics_test";
    static ConnectionUtil connUtil = new ConnectionUtil();
    public static void main(String[] args)  throws Exception {
        Connection conn = connUtil.getConn();
        Channel channel = conn.createChannel();
        //声明交换机 指定direct直连类型
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        //获取临时队列名称
        String queneName = channel.queueDeclare().getQueue();
        //绑定队列 绑定秘钥 *.test.*
        channel.queueBind(queneName, EXCHANGE_NAME, "*.test.*");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("接受类型:*.test.* , 路由秘钥:"+delivery.getEnvelope().getRoutingKey()+",接受消息: '" + message + "'");
        };
        channel.basicConsume(queneName, true, deliverCallback, consumerTag -> {});
    }
}

消费者2 error.# 代码
public class RoutingReceiver2 {
    final static String EXCHANG_NAME = "Topics_test";
    static ConnectionUtil connUtil = new ConnectionUtil();
    public static void main(String[] args)  throws Exception {
        Connection conn = connUtil.getConn();
        Channel channel = conn.createChannel();
        //声明交换机 指定direct直连类型
        channel.exchangeDeclare(EXCHANG_NAME, "topic");
        //获取临时队列名称
        String queneName = channel.queueDeclare().getQueue();
        //绑定队列 error.#
        channel.queueBind(queneName, EXCHANG_NAME, "error.#");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("接受类型:error.# , 路由秘钥:"+delivery.getEnvelope().getRoutingKey()+",接受消息: '" + message + "'");
        };
        channel.basicConsume(queneName, true, deliverCallback, consumerTag -> {});
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值