日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ入门-Routing直连模式

發(fā)布時間:2025/6/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ入门-Routing直连模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Hello World模式,告訴我們?nèi)绾我粚σ话l(fā)送和接收消息;

Work模式,告訴我們?nèi)绾味喙荦R下高效的消費消息;
Publish/Subscribe模式,告訴我們?nèi)绾螐V播消息
那么有沒有靈活強一點的既可以高效消費,又可以同時送達多個消費者的模式?
有,這就是Routing模式,我又稱之為Direct直連模式。

Routing模式

  • 一個生產(chǎn)者P,一個交換機X,多個消息隊列Q以及多個消費者C

  • 在Exchange和Queue中,我們看到了不同的規(guī)則,也就是Routing Key

顯然從圖中的說明,我們就知道這是一個log日志根據(jù)級別派發(fā)消息的例子。熟悉Log日志系統(tǒng)的應(yīng)該都知道,一般的log系統(tǒng)分為error、info、warn和debug等。從圖中我們可以看出,將日志級別為error的定向的派發(fā)到第一個消息隊列,將error、warn和info級別的日志派發(fā)到第一個消息隊列。

該模型首先實現(xiàn)了定向派發(fā),而不再是訂閱模式那種廣播式的派發(fā)。同一條消息既可以派發(fā)給一個Queue,也可以同時派發(fā)給兩個或者多個Queue,這就是該模式的靈活之處。下面來看看實例

發(fā)送端

/*** Created by jackie on 17/8/7.*/ public class EmitLogDirect {private static final String EXCHANGE_NAME = "direct_logs";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.3.161");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);String severity = getSeverity(argv);String message = getMessage(argv);channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + severity + "':'" + message + "'");channel.close();connection.close();}private static String getSeverity(String[] strings){if (strings.length < 1)return "info";return strings[0];}private static String getMessage(String[] strings){if (strings.length < 2)return "Hello World!";return joinStrings(strings, " ", 1);}private static String joinStrings(String[] strings, String delimiter, int startIndex) {int length = strings.length;if (length == 0 ) return "";if (length < startIndex ) return "";StringBuilder words = new StringBuilder(strings[startIndex]);for (int i = startIndex + 1; i < length; i++) {words.append(delimiter).append(strings[i]);}return words.toString();} }
  • String severity = getSeverity(argv);通過程序參數(shù)賦值給Routing Key,作為發(fā)送消息的規(guī)則

  • String message = getMessage(argv);通過程序參數(shù)賦值作為消息實體發(fā)送到Queue

在run configurations中配置argv

*第一個參數(shù)是要綁定key的名稱,第二個參數(shù)是要發(fā)送的消息內(nèi)容

  • 運行后,可以在RabbitMQ管理應(yīng)用中看到exchange,但是此時沒有綁定queue,所以即使發(fā)送消息也沒有queue會存儲或者消費。

接收端

/*** Created by jackie on 17/8/7.*/ public class ReceiveLogsDirect {private static final String EXCHANGE_NAME = "direct_logs";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.3.161");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);String queueName = channel.queueDeclare().getQueue();if (argv.length < 1){System.err.println("Usage: ReceiveLogsDirect [info] [warning] [error]");System.exit(1);}for(String severity : argv){channel.queueBind(queueName, EXCHANGE_NAME, severity);}System.out.println(" [*] Waiting for messages. To exit press CTRL+C");Consumer consumer = new DefaultConsumer(channel) {@Overridepublic 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);} }
  • channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);表示使用的exchange類型為Direct類型

  • 綁定的queue的名稱也是通過program arguments指定的

這里兩個參數(shù)info和error表示綁定了兩個routing key,即如果發(fā)送routing key為info的消息該隊列能接收到,如果發(fā)送routing key為error,該隊列也能收到

運行情況

啟動接收端代碼,我們可以看到生成了Queue名稱為amq.gen-ugjKo6t4y0PXPwoh3CeubA的隊列,同時有routingKey=info和routingKey=error的綁定到了Exchange上。

這時候起送發(fā)送端給routingkey為info發(fā)送消息“hello world”,我們可以看到在接收端確實能夠收到消息“hello world”,同理,這時候發(fā)送routingkey為error的消息,該隊列同樣能夠接收到,因為隊列同時綁定了兩個routing key

這個就是Routing直連模式。

如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續(xù)關(guān)注我的文章,請掃描二維碼,關(guān)注JackieZheng的微信公眾號,我會將我的文章推送給您,并和您一起分享我日常閱讀過的優(yōu)質(zhì)文章。

轉(zhuǎn)載于:https://www.cnblogs.com/bigdataZJ/p/rabbitmq6.html

總結(jié)

以上是生活随笔為你收集整理的RabbitMQ入门-Routing直连模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。