RabbitMQ 發布 訂閱

2021-09-12 03:34:31 字數 1619 閱讀 2786

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 預取等規則。發布訂閱模式如下圖所示 二 交換機 ...