黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Rabbitmq使用教程

Rabbitmq使用教程

更新時間:2021-06-17 11:24:42 來源:動力節(jié)點 瀏覽1214次

最簡單的使用

1.引用 rabbitMQ.Client

Install-Package RabbitMQ.Client

2.創(chuàng)建生產者

//創(chuàng)建連接工廠
ConnectionFactory factory = new ConnectionFactory
{
    UserName = "mqAdmin",//用戶名
    Password = "mqAdmin",//密碼
    HostName = "192.168.1.103"http://rabbitmq ip
};
//創(chuàng)建連接
var connection = factory.CreateConnection();
//創(chuàng)建通道
var channel = connection.CreateModel();
//聲明一個隊列
channel.QueueDeclare("hello", false, false, false, null);
Console.WriteLine("\nRabbitMQ連接成功,請輸入消息,輸入exit退出!");
string input;
do
{
    input = Console.ReadLine();
    var sendBytes = Encoding.UTF8.GetBytes(input);
    //發(fā)布消息
    channel.BasicPublish("", "hello", null, sendBytes);
} while (input.Trim().ToLower()!="exit");
channel.Close();
connection.Close();

3.創(chuàng)建生產者

//創(chuàng)建連接工廠
ConnectionFactory factory = new ConnectionFactory
{
    UserName = "admin",//用戶名
    Password = "admin",//密碼
    HostName = "192.168.157.130"http://rabbitmq ip
};
//創(chuàng)建連接
var connection = factory.CreateConnection();
//創(chuàng)建通道
var channel = connection.CreateModel();
//事件基本消費者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
//接收到消息事件
consumer.Received += (ch, ea) =>
{
    var message = Encoding.UTF8.GetString(ea.Body);
    Console.WriteLine($"收到消息: {message}");
    //確認該消息已被消費
    channel.BasicAck(ea.DeliveryTag, false);
};
//啟動消費者 設置為手動應答消息
channel.BasicConsume("hello", false, consumer);
Console.WriteLine("消費者已啟動");
Console.ReadKey();
channel.Dispose();
connection.Close();

RabbitMQ消費失敗的處理

RabbitMQ采用消息應答機制,即消費者收到一個消息之后,需要發(fā)送一個應答,然后RabbitMQ才會將這個消息從隊列中刪除,如果消費者在消費過程中出現異常,斷開連接切沒有發(fā)送應答,那么RabbitMQ會將這個消息重新投遞。

//接收到消息事件
consumer.Received += (ch, ea) =>
{
    var message = Encoding.UTF8.GetString(ea.Body);
    Console.WriteLine($"收到消息: {message}");
    Console.WriteLine($"收到該消息[{ea.DeliveryTag}] 延遲10s發(fā)送回執(zhí)");
    Thread.Sleep(10000);
    //確認該消息已被消費
    channel.BasicAck(ea.DeliveryTag, false);
    Console.WriteLine($"已發(fā)送回執(zhí)[{ea.DeliveryTag}]");
};

使用RabbitMQ的Exchange

前面我們可以看到生產者將消息投遞到Queue中,實際上這在RabbitMQ中這種事情永遠都不會發(fā)生。實際的情況是,生產者將消息發(fā)送到Exchange(交換器),由Exchange將消息路由到一個或多個Queue中(或者丟棄)

AMQP協(xié)議中的核心思想就是生產者和消費者隔離,生產者從不直接將消息發(fā)送給隊列。生產者通常不知道是否一個消息會被發(fā)送到隊列中,只是將消息發(fā)送到一個交換機。先由Exchange來接收,然后Exchange按照特定的策略轉發(fā)到Queue進行存儲。同理,消費者也是如此。Exchange 就類似于一個交換機,轉發(fā)各個消息分發(fā)到相應的隊列中。

RabbitMQ提供了四種Exchange模式:direct,fanout,topic,header 。但是 header模式在實際使用中較少,所以這里只介紹前三種模式。

Exchange不是消費者關心的,所以消費者的代碼完全不用變,用上面的消費者就行了。

Direct Exchange

所有發(fā)送到Direct Exchange的消息被轉發(fā)到具有指定RouteKey的Queue。

Direct模式,可以使用rabbitMQ自帶的Exchange:default Exchange 。所以不需要將Exchange進行任何綁定(binding)操作 。消息傳遞時,RouteKey必須完全匹配,才會被隊列接收,否則該消息會被拋棄。

//創(chuàng)建連接
var connection = factory.CreateConnection();
//創(chuàng)建通道
var channel = connection.CreateModel();
//定義一個Direct類型交換機
channel.ExchangeDeclare(exchangeName, ExchangeType.Direct, false, false, null);
//定義一個隊列
channel.QueueDeclare(queueName, false, false, false, null);
//將隊列綁定到交換機
channel.QueueBind(queueName, exchangeName, routeKey, null);

Fanout Exchange

所有發(fā)送到Fanout Exchange的消息都會被轉發(fā)到與該Exchange 綁定(Binding)的所有Queue上。

Fanout Exchange 不需要處理RouteKey 。只需要簡單的將隊列綁定到exchange 上。這樣發(fā)送到exchange的消息都會被轉發(fā)到與該交換機綁定的所有隊列上。類似子網廣播,每臺子網內的主機都獲得了一份復制的消息。

所以,Fanout Exchange 轉發(fā)消息是最快的。

為了演示效果,定義了兩個隊列,分別為hello1,hello2,每個隊列都擁有一個消費者。

static void Main(string[] args)
{
    string exchangeName = "TestFanoutChange";
    string queueName1 = "hello1";
    string queueName2 = "hello2";
    string routeKey = "";
    //創(chuàng)建連接工廠
    ConnectionFactory factory = new ConnectionFactory
    {
        UserName = "admin",//用戶名
        Password = "admin",//密碼
        HostName = "192.168.157.130"http://rabbitmq ip
    };
    //創(chuàng)建連接
    var connection = factory.CreateConnection();
    //創(chuàng)建通道
    var channel = connection.CreateModel();
    //定義一個Direct類型交換機
    channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, false, false, null);
    //定義隊列1
    channel.QueueDeclare(queueName1, false, false, false, null);
    //定義隊列2
    channel.QueueDeclare(queueName2, false, false, false, null);
    //將隊列綁定到交換機
    channel.QueueBind(queueName1, exchangeName, routeKey, null);
    channel.QueueBind(queueName2, exchangeName, routeKey, null);
    //生成兩個隊列的消費者
    ConsumerGenerator(queueName1);
    ConsumerGenerator(queueName2);
    Console.WriteLine($"\nRabbitMQ連接成功,\n\n請輸入消息,輸入exit退出!");
    string input;
    do
    {
        input = Console.ReadLine();
        var sendBytes = Encoding.UTF8.GetBytes(input);
        //發(fā)布消息
        channel.BasicPublish(exchangeName, routeKey, null, sendBytes);
    } while (input.Trim().ToLower() != "exit");
    channel.Close();
    connection.Close();
}
/// <summary>
/// 根據隊列名稱生成消費者
/// </summary>
/// <param name="queueName"></param>
static void ConsumerGenerator(string queueName)
{
    //創(chuàng)建連接工廠
    ConnectionFactory factory = new ConnectionFactory
    {
        UserName = "admin",//用戶名
        Password = "admin",//密碼
        HostName = "192.168.157.130"http://rabbitmq ip
    };
    //創(chuàng)建連接
    var connection = factory.CreateConnection();
    //創(chuàng)建通道
    var channel = connection.CreateModel();
    //事件基本消費者
    EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
    //接收到消息事件
    consumer.Received += (ch, ea) =>
    {
        var message = Encoding.UTF8.GetString(ea.Body);
        Console.WriteLine($"Queue:{queueName}收到消息: {message}");
        //確認該消息已被消費
        channel.BasicAck(ea.DeliveryTag, false);
    };
    //啟動消費者 設置為手動應答消息
    channel.BasicConsume(queueName, false, consumer);
    Console.WriteLine($"Queue:{queueName},消費者已啟動");
}

Topic Exchange

所有發(fā)送到Topic Exchange的消息被轉發(fā)到能和Topic匹配的Queue上,
Exchange 將路由進行模糊匹配。可以使用通配符進行模糊匹配,符號“#”匹配一個或多個詞,符號“”匹配不多不少一個詞。因此“XiaoChen.#”能夠匹配到“XiaoChen.pets.cat”,但是“XiaoChen.” 只會匹配到“XiaoChen.money”。
所以,Topic Exchange 使用非常靈活。
string exchangeName = "TestTopicChange";
string queueName = "hello";
string routeKey = "TestRouteKey.*";
//創(chuàng)建連接工廠
ConnectionFactory factory = new ConnectionFactory
{
    UserName = "admin",//用戶名
    Password = "admin",//密碼
    HostName = "192.168.157.130"http://rabbitmq ip
};
//創(chuàng)建連接
var connection = factory.CreateConnection();
//創(chuàng)建通道
var channel = connection.CreateModel();
//定義一個Direct類型交換機
channel.ExchangeDeclare(exchangeName, ExchangeType.Topic, false, false, null);
//定義隊列1
channel.QueueDeclare(queueName, false, false, false, null);
//將隊列綁定到交換機
channel.QueueBind(queueName, exchangeName, routeKey, null);
Console.WriteLine($"\nRabbitMQ連接成功,\n\n請輸入消息,輸入exit退出!");
string input;
do
{
    input = Console.ReadLine();
    var sendBytes = Encoding.UTF8.GetBytes(input);
    //發(fā)布消息
    channel.BasicPublish(exchangeName, "TestRouteKey.one", null, sendBytes);
} while (input.Trim().ToLower() != "exit");
channel.Close();
connection.Close();

以上就是動力節(jié)點小編介紹的"Rabbitmq使用教程",希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 91久久99热青草国产 | 成人欧美一区二区三区视频不卡 | 视频福利一区 | 中文字幕在线精品视频入口一区 | 国产高级黄区18勿进一区二区 | 天天操2023| 婷婷在线成人免费观看搜索 | 精品国产v无码大片在线观看 | 免费观看色视频 | 在线成年视频免费观看 | 日本一道在线观看 | 视频一区二区三区自拍 | 老子影院午夜伦不卡亚洲 | 免费看黄色视屏 | 成人爽爽激情在线观看 | 一级 黄 色 片免费 一级 黄 色 毛片 | 免费香蕉一区二区在线观看 | 亚洲日本中文 | 香蕉色香蕉在线视频 | 国产欧美日韩看片片在线人成 | a级片免费网站 | 狠狠插狠狠干 | 人人艹人人干 | 2021天天操 | 欧美a在线观看 | 55夜色66夜色国产亚洲精品区 | 人人揉人人添人人捏人人看 | 午夜在线观看免费 | 九九影视理论片在线播放 | 日韩在线观看内窥镜 | 在线播放黄色网址 | 亚洲高清一区二区三区四区 | 丝袜足控免费网站xx视频 | 日韩资源站 | 美女一级牲交毛片视频 | 欧美日韩国产动漫 | 日韩欧美手机在线 | 午夜视频国产 | 波多野结衣一区二区三区四区 | 色黄大色黄女片免费看软件 | 美女一级毛片毛片在线播放 |