<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 1. 多重綁定 Direct 交換機可以選擇將哪些消息發送到哪些隊列上,不將哪些消息發送到哪些隊列上。 ![](https://img.kancloud.cn/02/17/0217f71ead5745dd4ba519354104b0ab_1405x340.jpg) 上圖中,我們可以看到 X 綁定了兩個隊列,交換機類型是 direct。隊列 Q1 綁定鍵為 orange,隊列 Q2 綁定鍵有兩個:一個綁定鍵為 black,另一個綁定鍵為 green。 <br/> 在這種綁定情況下,生產者發布消息到 exchange 上,綁定鍵為 orange 的消息會被發布到隊列 Q1。綁定鍵為 black、green 的消息會被發布到隊列 Q2,其他沒有被綁定的消息將被丟棄。 <br/> :-: ![](https://img.kancloud.cn/a9/c1/a9c1de04f8ce241d4b45d32e1463192b_1359x345.jpg) 多重綁定 當 exchange 類型是 direct,但是它綁定的多個隊列的 key 都相同,在這種情況下雖然 exchange 類型是 direct,但是它表現的就和 fanout 交換機有點類似了,就跟廣播差不多。 <br/> # 2. Direct交換機演示 演示下圖的 Direct 交換機。 ![](https://img.kancloud.cn/6f/2e/6f2e5866315ddb14ae99353971b37c9d_1434x438.jpg) 步驟如下: **1. 生產者** ```java public class EmitLogDirect { private static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] argv) throws Exception { try (Channel channel = RabbitMQUtils.getChannel()) { //聲明exchange類型 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //創建多個 bindingKey Map<String, String> bindingKeyMap = new HashMap<>(); bindingKeyMap.put("info", "info信息"); bindingKeyMap.put("warning", "warning信息"); bindingKeyMap.put("error", "error信息"); bindingKeyMap.put("debug", "debug信息"); for (Map.Entry<String, String> bindingKeyEntry : bindingKeyMap.entrySet()) { String bindingKey = bindingKeyEntry.getKey(); String message = bindingKeyEntry.getValue(); /* * 發送消息。 * basicPublish(String var1, String var2, BasicProperties var3, byte[] var4) * var1: 交換機名稱 * var2: bindingKey名稱 * var3: 其他參數 * var4: 發送的消息 */ channel.basicPublish(EXCHANGE_NAME, bindingKey, null, message.getBytes("UTF-8")); System.out.println(EmitLogDirect.class.getSimpleName() + "[生產者發出消息]: " + message); } } } } ``` **2. 兩個消費者** (1)*`ReceiveLogsDirect01`* ```java public class ReceiveLogsDirect01 { private static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] argv) throws Exception { Channel channel = RabbitMQUtils.getChannel(); channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); String queueName = "queue.error"; //聲明一個隊列 channel.queueDeclare(queueName, false, false, false, null); //隊列與交換機綁定,綁定的key=error channel.queueBind(queueName, EXCHANGE_NAME, "error"); System.out.println(ReceiveLogsDirect01.class.getSimpleName() + "[等待接收消息...]"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); message = "bindKey=" + delivery.getEnvelope().getRoutingKey() + ", msg=" + message; System.out.println(ReceiveLogsDirect01.class.getSimpleName() + "[接收到的消息]: " + message); }; channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { }); } } ``` (2)*`ReceiveLogsDirect02`* ```java public class ReceiveLogsDirect02 { private static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] argv) throws Exception { Channel channel = RabbitMQUtils.getChannel(); channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); String queueName = "queue.console"; channel.queueDeclare(queueName, false, false, false, null); //注意:這里綁定了兩個key channel.queueBind(queueName, EXCHANGE_NAME, "info"); channel.queueBind(queueName, EXCHANGE_NAME, "warning"); System.out.println(ReceiveLogsDirect02.class.getSimpleName() + "[等待接收消息...]"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); message = "bindKey=" + delivery.getEnvelope().getRoutingKey() + ", msg=" + message; System.out.println(ReceiveLogsDirect02.class.getSimpleName() + "[接收到的消息]: " + message); }; channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { }); } } ``` **3. 測試** 先啟動兩個消費者,再啟動生產者并生產4條消息,控制臺輸出如下。 ``` -----------EmitLogDirect生產者生產了4條消息----------- EmitLogDirect[生產者發出消息]: debug信息 EmitLogDirect[生產者發出消息]: warning信息 EmitLogDirect[生產者發出消息]: error信息 EmitLogDirect[生產者發出消息]: info信息 -----------ReceiveLogsDirect01消費者收到了error消息----------- ReceiveLogsDirect01[接收到的消息]: bindKey=error, msg=error信息 -----------ReceiveLogsDirect02消費者收到warning與info共兩條消息----------- ReceiveLogsDirect02[接收到的消息]: bindKey=warning, msg=warning信息 ReceiveLogsDirect02[接收到的消息]: bindKey=info, msg=info信息 ``` 由于`debug`消息沒有與任何隊列綁定,所以被丟棄了。 **** 案例代碼:https://gitee.com/flymini/codes01/tree/master/rabbitmq_/com-learn-rabbitmq01
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看