zoukankan      html  css  js  c++  java
  • topics

     

    由于使用fanout类型的exchange只能进行全局的广播,因此我们使用direct类型的exchange做了代替, 使得我们可以选择性的接收消息。尽管使用fanout exchange改进了log系统,但它仍然有限制——不能基于多个条件做路由。

    在log系统中可能不只是基于不同的日志级别作订阅,也可能会基于日志的来源。你也许听过Unix下名为syslog的工具, 它把日志按照严重级别(info/warn/crit…)和设备(auth/cron/ker…)进行路由。

    这会给我们许多的灵活性,也许我们只想监听’cron’中的’critical’级别的错误日志,以及所有’kern’中的日志。 为了实现这种日志系统,我们需要学习一个更复杂的topic类型的exchange。

    发送到topic exchange中的消息不能有一个任意的routing_key——它必须是一个使用点分隔的单词列表。单词可以是任意的, 但是通常会指定消息的一些特定。一些有效的routing key例子:”stock.usd.nyse”,”nyse.vmw”,”quick.orange.rabbit”。 routing key的长度限制为255个字节数。

    binding key也必须是相同的形式。topic exchange背后的逻辑类似于direct——一条使用特定的routing key发送的消息将会被传递至所有使用与该routing key相同的binding key进行绑定的队列中。 然而,对binding key来说有两种特殊的情况:

    1. *(star)可以代替任意一个单词

    2. #(hash)可以代替0个或多个单词

    发布消息

    channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
    
       
              String message = "helloworld";
              String routingKey="quick.orange.rabbit";
              //routekey是使用 . 分割的单词列表
              channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));

    订阅消息

      channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        String queueName = channel.queueDeclare().getQueue();
          channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");
  • 相关阅读:
    差分约束+SPFA+栈
    差分约束问题讲解博客
    最小费用最大流2
    最小费用最大流
    合并油田
    PHP核心技术与最佳实践--笔记
    PHP命令行模式
    vim一些常用的快捷键
    varnish 的一个配置
    redis在我工作中的实际应用
  • 原文地址:https://www.cnblogs.com/woms/p/7040869.html
Copyright © 2011-2022 走看看