2.【RabbitMQ實戰】- Hellow World

Producer:生產者
Consumer:消費者
RabbitMQ:中間的框是一個隊列-RabbitMQ 代表使用者保留的消息緩衝區

image.png

依賴

<PackageReference Include="RabbitMQ.Client" Version="6.4.0" />

生產者代碼

using RabbitMQ.Client;

using System.Reflection;
using System.Text;
using System.Threading.Channels;

namespace _01.Rabbitmq.Producer
{
	public class Program
    {

        private static string queueName = "hello";
        static void Main(string[] args)
        {
            // 創建一個連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                HostName = "localhost",
                UserName = "guest",
                Password = "guest",
            };

            using var connection = factory.CreateConnection();
            using var channel = connection.CreateModel();
            /*
            *生成一個隊列
            *1.隊列名稱
            *2.隊列裏面的消息是否持久化默認消息存儲在內存中
            *3.該隊列是否只供一個消費者進行消費是否進行共享true可以多個消費者消費
            *4.是否自動刪除最後一個消費者端開連接以後該隊列是否自動刪除true自動刪除*
            *5.其他參數
            */
            channel.QueueDeclare("hello", false, false, false, null);//創建一個名稱爲hello的消息隊列
            for (int i = 0; i < 100; i++)
            {
                string message = i + "Hello World"; //控制檯傳遞的消息內容
                var body = Encoding.UTF8.GetBytes(message);

                /*
                * 發送一個消息
                * 1.發送到那個交換機
                * 2.路由的 key 是哪個
                * 3.其他的參數信息
                * 4.發送消息的消息體
                */
                channel.BasicPublish(exchange:"", "hello", null, body); //開始傳遞
                Console.WriteLine("已發送: {0}", message);
            }     
            Console.ReadKey();
        }
    }

}

消費者代碼


using RabbitMQ.Client;
using RabbitMQ.Client.Events;

using System.Text;

namespace _01.Rabbitmq.Consumer
{
    public class Program
    {
        private static string queueName = "hello";

        static void Main(string[] args)
        {

            // 創建一個連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                HostName = "localhost",
                UserName = "guest",
                Password = "guest",
            };


            // publisher/consumer和broker之間的TCP連接
            using var connection = factory.CreateConnection();
            // Channel作爲輕量級的Connection極大減少了操作系統建立TCPconnection的開銷
            using var channel = connection.CreateModel();
            // 創建隊列/交換機(如隊列/交換機已存在的情況可不用再次創建/此創建爲:確保先開啓消費者,生產者未創建隊列/交換機而引發報錯)
            channel.QueueDeclare("hello", false, false, false, null);
            // 事件對象
            var consumer = new EventingBasicConsumer(channel);

            /*
            * 消費者消費消息
            * 1.消費哪個隊列
            * 2.消費成功之後是否要自動應答 true 代表自動應答 false 手動應答
            * 3.消費者未成功消費的回調
            */
            channel.BasicConsume("hello", false, consumer);

            // 接收消息回調
            consumer.Received += (sender, e) =>
            {
                var body = e.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine("已接收: {0}", message);

            };
            Console.ReadKey();
        }
    }

}

測試效果

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章