• Rabbitmq-direct演示


    在上一节中我们创建了一个日志系统。实现将日志消息广播给所有的cusumer。

    在这片教程中,我们将为日志系统添加一个功能:仅仅订阅一部分消息。比如:我们可以直接将关键的错误类型日志消息保存到日志文件中,还可以同时将所有的日志消息打印到控制台。

    绑定(binding)

      在之前的例子中,我们已经创建了绑定:

      channel.queueBind(queueName,EXCHANGE_NAME,"");

      一个绑定是建立在一个队列和一个路由器之间的关系,可以解读为:该队列对这个路由器中的消息感兴趣。

      绑定可以设置另外的参数:路由键(routing key)。为了避免和producer中的void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)中的routingKey混淆,我们将这里的key称为绑定键binding key,下面的代码展示了如何使用绑定键来创建一个绑定关系:

      channel.queueBind(queueName,EXCHANGE_NAME,"black");

      绑定键的含义取决于路由器的类型,我们之前用的fanout类型交换机会忽略该值。

    直接交换(Direct Exchange)

      我们之前的日志系统会将所有消息广播给所有消费者。现在我们想根据日志的严重程度来过滤日志。比如,我们想要一个程序来将error日志写到磁盘文件中,而不要将warning或info日志写到磁盘中,以免浪费磁盘空间。

      我们之前使用的fanout路由器缺少灵活性,它只是没头脑地广播消息。所以,我们用direct路由器来替换它。direct路由器背后的路由算法很简单:只有当消息的路由键routing key与队列的绑定键binding key完全匹配时,该消息才会进入该队列。

      直接交换机器x与两个队列绑定。第一个队列以绑定键orange来绑定,第二个队列以两个绑定键black和green和交换机绑定。 按照这种设置,路由键为orange的消息以发布给交换机后,将会被路由到队列Q1,路由键为black或者green的消息将会路由到队列Q2。

    多重绑定(Multiple bindings)

      

      多个队列以相同的绑定键binding key绑定到同一个Exchange上,是完全可以的。按照这种方式设置的话,直接路由器就会像fanout路由器一样,将消息广播给所有符合路由规则的队列。一个路由键为black的消息将会发布到队列Q1和Q2。

    发布消息

      我们使用direct来代替fanout,同时我们为日志设置严重级别,并将此作为路由键。这样,接受者就可以选择性的接受日志消息。

      首先,声明一个交换机

      channel.exchangeDeclare(EXCHANGE_NAME,“direct”);

      然后,发送一个消息

      channel.basicPublish(EXCHANGE_NAME,severity,null,message.getBytes());

      我们此处只设置一种severity。在info warning error中任选一种。

    消息订阅

      String queueName = channel.queueDeclare().getQueue();

      for(String severity:argv){

        channel.queueBind(queueName,EXCHANGE_NAME,severity);

      }  

    完整代码如下:

     生产者:

      

    消费者:

      启动一个消费者实例(ReceiveLogDirect),将其要监听的级别改为String[] severity = {"error"},再启动另一个消费者实例。此时这两个消费者都开始监听了,一个监听所有级别的日志,另一个监听error日志。然后启动生产者,将info分别改为warning、error后启动。

      可看到如下输出:

      

      

  • 相关阅读:
    leetcode 153. Find Minimum in Rotated Sorted Array 寻找旋转排序数组中的最小值(中)
    Python写实用小工具实现图片转字符画
    leetcode 215. Kth Largest Element in an Array 数组中的第K个最大元素
    leetcode 75. Sort Colors 颜色分类
    leetcode 347. Top K Frequent Elements 前 K 个高频元素
    记一次 异常断电导致测试服务器无法正常启动,默认进入救援模式(Redhat 7.8)
    NTP: 时钟源管理
    获取MobaXterm 保存的账号密码
    k8s 问题记录:MYSQL_USER="root", MYSQL_PASSWORD cannot be used for the root user
    K8S报错整理_kubectl: Error from server: error dialing backend: remote error: tls: internal error
  • 原文地址:https://www.cnblogs.com/zhangbLearn/p/9533250.html
Copyright © 2020-2023  润新知