歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

以及聲明一個exclusive的 CAD加密 回調queue用來接收響應的消息

點擊: 次  來源:寶鼎軟件 時間:2017-06-01

原文出處: Listen

在上一小節中我們改造了log系統,由于利用fanout范例的exchange只能舉辦全局的廣播,因此我們利用direct范例的exchange做了取代, 使得我們可以選擇性的吸收動靜。盡量利用fanout exchange改造了log系統,但它仍然有限制——不能基于多個條件做路由。

Topics

在log系統中大概不可是基于差異的日志級別作訂閱,軟件開發,也大概會基于日志的來歷。你也許聽過Unix下名為syslog的東西, 它把日志憑據嚴重級別(info/warn/crit…)和設備(auth/cron/ker…)舉辦路由。

這會給我們很多的機動性,也許我們只想監聽’cron’中的’critical’級此外錯誤日志,以及所有’kern’中的日志。 為了實現這種日志系統,我們需要進修一個更巨大的topic范例的exchange。

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個或多個單詞

利用一張圖可以很簡樸地來說明:

在圖中,我們將要發送被描寫的動物的動靜。動靜的routing key將由三個單詞構成(通過兩個點脫離)。routing key中的第一個單詞將描寫速度, 第二個是顏色,第三個是物種:"<speed>.<colour>.<species>"。

我們建設三個綁定:Q1利用binding key"*.orange.*"來綁定,Q2利用"*.*.rabbit"以及lazy.#綁定。

這些綁定可以被總結為:

  • Q1對所有橘色的的動物感樂趣
  • Q2想要吸收所有關于兔子的動靜以及所有關于lazy的動物的動靜
  • 一條利用routing key"quick.orange.rabbit"發送的動靜將被同時通報到兩個行列中。動靜"lazy.orange.elephant"同樣如此。 另一方面,"quick.orange.fox"只會被第一個queue吸收,"lazy.brown.fox"只會被第二個queue吸收。?"lazy.pink.rabbit"只會被通報到Q2一次,縱然它對兩個binding key都匹配。"quick.brown.fox"與兩個queue的binding key都不匹配, 因此將被揚棄。

    假如沖破我們的約定,利用一個單詞可能四個單詞的routing key譬喻"orange","quick.orange.male.rabbit"發送動靜將會產生什么? 這些動靜不會匹配任何綁定,因此會丟失。

    可是對付"lazy.orange.male.rabbit",縱然它有四個單詞,可是它與第二個queue的binding key匹配,因此將會被發送到第二個queue中。

    當一個queue利用"#"(hash)作為binding key,那么它將會吸收所有的動靜,忽略routing key,就仿佛利用了fanout exchange。 當非凡字符”*“(star)和”#“(hash)在綁定中沒有用到,topic exchange將會與direct exchange的行為溝通。

    相識了topic exchange之后,我們將它用在我們的log系統中,我們界說的routing key將會有兩個單詞構成:"<facility>.<severity>"。

    完成的EmitLogTopic.java

    public class EmitLogTopic {
    
        private static final String EXCHANGE_NAME = "topic_logs";
    
        public static void main(String[] argv)
                      throws Exception {
    
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("localhost");
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
    
            channel.exchangeDeclare(EXCHANGE_NAME, "topic");
    
            String routingKey = getRouting(argv);
            String message = getMessage(argv);
    
            channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());
            System.out.println(" [x] Sent '" + routingKey + "':'" + message + "'");
    
            connection.close();
        }
        //...
    }

    完整的ReceiveLogsTopic.java:

    public class ReceiveLogsTopic {
      private static final String EXCHANGE_NAME = "topic_logs";
    
      public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
    
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        String queueName = channel.queueDeclare().getQueue();
    
        if (argv.length < 1) {
          System.err.println("Usage: ReceiveLogsTopic [binding_key]...");
          System.exit(1);
        }
    
        for (String bindingKey : argv) {
          channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
        }
    
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    
        Consumer consumer = new DefaultConsumer(channel) {
          @Override
          public void handleDelivery(String consumerTag, Envelope envelope,
                                     AMQP.BasicProperties properties, byte[] body) throws IOException {
            String message = new String(body, "UTF-8");
            System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + message + "'");
          }
        };
        channel.basicConsume(queueName, true, consumer);
      }
    }

    運行的時候從呼吁行中輸入binding key來舉辦綁定,吸收差異的動靜。

    Remote procedure call (RPC)

    排列三305组选前后关系 广西快乐双彩最新开奖结果查询 贵州快3和值中奖规则 广东十一选五定牛网 腾讯分分彩在线人工 幸运农场app 彩吧论坛首页一彩票论坛 福彩3d和值走势图 高手揭秘后三组选包胆规则 白小姐三肖必选一肖 怎样查询股票代码