rabbitmq 中訊息傳遞模型的核心思想是:生產者永遠不會將任何訊息直接傳送到佇列。實際上,生產者通常甚至不知道訊息是否會被傳遞到任何佇列。
相反,生產者只能向交易所(exchanges)傳送訊息。交換是一件非常簡單的事。一方面,它接收來自生產者的訊息,另一方面將它們推送到佇列。交易所必須確切知道如何處理它收到的訊息,它應該附加到特定佇列嗎?他應該附加到多個佇列嗎?或者他應該被丟棄嗎?其規則由 交換型別定義(exchanges type)。
交換型別有幾種可供選擇:直接direct , 主題topic , 標題headers , 扇出fanout 。建立乙個名為logs的fanout交換型別。
channel.exchangedeclare("logs",fanout);
fanout 交換,他只能將收到的所有資訊廣播到他知道的其他佇列中。
回想一下我們之前如何發布訊息的:channel.basicpublish("","hello",null,massage.getbytes());
第乙個引數就是交換的名稱。預設是無名交換就是通過空字串(「」)來識別的。rabbitmqctl list_exchanges 命令用來檢視伺服器上所有的交換列表。訊息通過routingkey指定的名稱的路由到佇列(如果存在)。
現在發布到logs交換
channel.basicpublish("logs","hello",null,massage.getbytes());
成功連線到rabbitmq後,預設建立出臨時佇列(有待考察,乙個連線能使用多少個臨時佇列)。
斷開消費者時,臨時佇列會自動刪除。
臨時佇列只針對流動資料,當你想要在生產者和消費者之間共享佇列時使用。
// 獲得乙個臨時佇列
channel.queuedeclare();
// 獲得臨時佇列的名稱
string queuename = channel.queuedeclare().getqueue();
告訴交換機將訊息傳送到我們的佇列,交換機和佇列之間的關係為繫結 binding
channel.queuebind( queuename , "logs" , " " ); // logs交換機將訊息附加到我們的佇列中。
rabbitmqctl list_bindings 命令是列出所有的繫結
// 生產者
public class sendlog
// 關閉通道和連線
channel.close();
conn.close();
}}// 消費者
public class receiverlog ;
channel.basicconsume(queuename, true, delivercallback, consumertag -> {});
}}
1. 上面的案例中使用的是臨時佇列,結合臨時佇列的特性。
2. 生產者下channel.basicpublish(exchange_name,"",null,message.getbytes("utf-8)); 第二個引數不能使用 null代替,這是rontingkey 引數的存放位置。
rabbitmq 發布訂閱模式
上篇我們已經講過了工作模式和簡單模式的用法。而這節我們就要開始講一下後面三種的第一種,在我們平常開發中,其實用的比較多的是後面的這三種。發布訂閱模式 英文叫publish subscribe,發布訂閱模式也稱為廣播模式,在exchange下屬於fanout模式。廣播,大家應該都知道吧,在mq中,其實...
RabbitMQ發布 訂閱模式
1 生產者 package com.ys.ps import com.rabbitmq.client.channel import com.rabbitmq.client.connection import com.ys.utils.connectionutil create by ysocean ...
RabbitMQ(三) 發布訂閱
rabbitmq 三 發布訂閱 一 概述 rabbitmq的發布訂閱 publish subscribe 其將生產者和消費者進一步解耦,生產者生產訊息後,交付給交換機,消費者上線後,主動主動去佇列中取資料進行處理。該模式也符合上一節工作佇列中的ack 預取等規則。發布訂閱模式如下圖所示 二 交換機 ...