我們知道rabbitmq的exchange常用交換器型別分為fanout、direct、topic、headers 4種型別,這裡我們將對fanout、direct、topic 3種型別以實際**的形式進行講解,至於關於交換器對各型別的具體講解,請參照文章開始給出的鏈結進行了解,這裡就不再贅述,我們新建了如下圖的解決方案:
1、rabbitmqhelper 幫助類,對常用的訊息入隊以及消費訊息進行了簡單的封裝:
/// /// rabbitmqhelper
///
public class rabbitmqhelper
#region 單訊息入隊
/// /// 單訊息入隊
///
/// 交換器名稱
/// 交換器型別
/// 路由關鍵字
/// 訊息例項
public static void enqueue(string exchangename, string exchangetype, string routingkey, titem message)}}
}catch (exception ex)
}#endregion
#region 訊息批量入隊
/// /// 訊息批量入隊
///
/// 交換器名稱
/// 交換器型別
/// 路由關鍵字
/// 訊息集合
public static void enqueue(string exchangename, string exchangetype, string routingkey, listlist)}}
}}}catch (exception ex)
}#endregion
#region 消費訊息佇列(舊的方式)
/// /// 消費訊息佇列
///
/// 訊息物件
/// 交換器名稱
/// 交換器型別
/// 路由關鍵字
/// 佇列名稱
/// 消費訊息的具體操作
/// 消費失敗後,繼續嘗試消費的次數
public static void consume(string exchangename, string exchangetype, string routingkey, string queuename, funcfunc, int trytimes = 5)}}
}}}catch (exception ex)
}#endregion
#region 消費訊息佇列(新的方式)
/// /// 消費訊息佇列
///
/// 訊息物件
/// 交換器名稱
/// 交換器型別
/// 路由關鍵字
/// 佇列名稱
/// 消費訊息的具體操作
/// 消費失敗後,繼續嘗試消費的次數
public static void newconsume(string exchangename, string exchangetype, string routingkey, string queuename, funcfunc, int trytimes = 5)}}
}};channel.basicconsume(queuename, false, consumer);}}
}catch (exception ex)
}#endregion
}
備註:需要說明的是這裡在對消費訊息的方法進行封裝的過程中使用了泛型委託,這樣我們就只需要按照自己的業務需求,對訊息進行處理了。2、 fanout型別:簡單的說適合這樣的場景,乙個生產者產生的訊息,需要將該訊息傳送到多個訊息佇列,供多個消費者進行消費。這裡,為了對該場景進行還原,所以新建了rabbitmqconsumer,rabbitmqconsumer1兩個消費者。
生產者**:
public form1()
private void producer_click(object sender, eventargs e));}
消費者1**:
class program
/// /// 消費訊息
///
/// 處理物件
/// 消費結果
public static bool consumemessage(developer developer)
}
消費者2**:
class program
/// /// 消費訊息
///
/// 處理物件
/// 消費結果
public static bool consumemessage(developer developer)
}
消費者1與消費者2的**,眨眼一看,不是一樣的嗎?仔細看會發現它們在的訊息佇列名稱不一樣,消費者1的佇列名稱是「developqueue」,訊息者2的佇列名稱是「developqueue1」,因為這兩個訊息佇列都與交換器「developexchange」進行了繫結,所以生產者產生的訊息將被推送到這兩個訊息佇列。執行**,得到如下圖結果:
3、direct型別:直譯過來就是直接的意思,該型別適用於點對點的使用場景,生產者將訊息傳送到指定的訊息佇列:
生產者**:
public form1()
private void producer_click(object sender, eventargs e));}
消費者1**:
static void main(string args)
/// /// 消費訊息
///
/// 處理物件
/// 消費結果
public static bool consumemessage(developer developer)
消費者2**:
static void main(string args)
/// /// 消費訊息
///
/// 處理物件
/// 消費結果
public static bool consumemessage(developer developer)
生產者的路由關鍵字是「directkey」,消費者1的路由關鍵字為」directkey「,消費者2的路由關鍵字為」directkey1「,僅僅一字相差,生產者產生的訊息就只有消費者1能夠收到,執行**得到如圖結果:
至於topic型別,這裡就不再以**進行講解了,其實大致使用方法與上面的direct型別相似,不同之處在於topic型別可通過路由關鍵字進行模糊匹配,將訊息路由到相應佇列,大家可根據自己的實際使用場景,進行型別的選擇。
訊息佇列Rabbitmq
rabbitmq server rabbitmqctl reset rabbitmqctl stop rabbitmqctl stop rabbitmqctl list users rabbitmqctl list queues rabbitmqctl add user user name user...
訊息佇列RabbitMQ
這是乙個很嚴肅的問題。系統之間解除耦合,可以讓不同語言編寫的系統通訊互動 保證伺服器負載不會飆公升。高大上一點就是流量削峰。讓程式變成非同步,提高響應速度。把費時任務放到另乙個程序或執行緒去執行。redis實現 剛開始學習redis時,一看這個鍊錶不就是給佇列準備的嗎?所以,一心扎進去,要寫個佇列出...
RabbitMQ訊息佇列
訊息發布接收流程 接收訊息 工作模式 publish subscribe 發布訂閱模式 發布訂閱publish subscribe和工作模式work queues的區別 routing 路由模式 區別 topics 區別 header 宣告佇列 bean queue inform sms publi...