欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用RabbitMQ發(fā)送和接收消息工具類的實現(xiàn)

 更新時間:2023年12月19日 11:36:48   作者:讓夢想瘋狂  
RabbitMQ是一個消息的代理器,用于接收和發(fā)送消息,本文主要介紹了C#使用RabbitMQ發(fā)送和接收消息工具類的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

下面是一個簡單的 C# RabbitMQ 發(fā)送和接收消息的封裝工具類的示例代碼:

工具類

通過NuGet安裝RabbitMQ.Client

using Newtonsoft.Json;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;

namespace WorkerService1
{
    public class RabbitMQHelper : IDisposable
    {
        private readonly ConnectionFactory _factory;
        private IConnection _connection;
        private IModel _channel;
        public RabbitMQHelper()
        {
            // 設(shè)置連接參數(shù)
            _factory = new ConnectionFactory() { HostName = "localhost", Port = 5672, UserName = "guest", Password = "guest" };
        }

        /// <summary>
        /// 發(fā)送消息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queueName"></param>
        /// <param name="message"></param>
        public void SendMessage<T>(string queueName, T message)
        {
            try
            {
                InitConnection();

                // 聲明隊列
                _channel.QueueDeclare(queue: queueName,
                    durable: true,// 設(shè)置為true表示隊列是持久化的
                    exclusive: false,
                    autoDelete: false,
                    arguments: null);

                var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));

                _channel.BasicPublish(exchange: "", routingKey: queueName, basicProperties: null, body: body);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to send message: {0}", ex.Message);
            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queueName"></param>
        /// <param name="messageHandler"></param>
        public void ReceiveMessage<T>(string queueName, Action<T> messageHandler)
        {
            try
            {
                InitConnection();

                // 聲明隊列(接收需聲明隊列,否則隊列不存在時,無法接收消息)
                _channel.QueueDeclare(queue: queueName,
                    durable: true, // 設(shè)置為true表示隊列是持久化的
                    exclusive: false,
                    autoDelete: false,
                    arguments: null);

                //設(shè)置消費者數(shù)量(并發(fā)度),每個消費者每次只能處理一條消息
                _channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

                // 創(chuàng)建消費者
                var consumer = new EventingBasicConsumer(_channel);
                consumer.Received += (model, ea) =>
                {
                    try
                    {
                        var message = Encoding.UTF8.GetString(ea.Body.ToArray());

                        var convertedMessage = JsonConvert.DeserializeObject<T>(message);

                        //委托方法
                        messageHandler.Invoke(convertedMessage);

                        // 消息處理成功,確認消息
                        _channel.BasicAck(ea.DeliveryTag, false);
                    }
                    catch (Exception ex)
                    {
                        // 消息處理異常,確認消息
                        _channel.BasicAck(ea.DeliveryTag, false);
                    }
                };

                _channel.BasicConsume(queue: queueName,
                    autoAck: false,// 設(shè)置為true表示自動確認消息
                    consumer: consumer);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to receive message: {0}", ex.Message);
            }
        }

        /// <summary>
        /// 初始化鏈接
        /// </summary>
        private void InitConnection()
        {
            if (_connection == null || !_connection.IsOpen)
            {
                _connection = _factory.CreateConnection();
                _channel = _connection.CreateModel();
            }
        }

        /// <summary>
        /// 釋放資源
        /// </summary>
        public void Dispose()
        {
            _channel?.Close();
            _channel?.Dispose();
            _connection?.Close();
            _connection?.Dispose();
        }
    }
}

使用示例

using System;
using System.Text;
using System.Threading.Tasks;
using WorkerService1;

public class Program
{
    private static string QueueName = "myqueue_key";
    public static void Main()
    {

        var rabbitMQHelper = new RabbitMQHelper();
        for (long i = 0; i < 30; i++)
        {
            rabbitMQHelper.SendMessage(QueueName, i);
        }

        rabbitMQHelper.ReceiveMessage<long>(QueueName, ReceivedHandle);

        Console.ReadLine();
    }

    /// <summary>
    /// 接收處理
    /// </summary>
    /// <param name="index"></param>
    private static void ReceivedHandle(long index)
    {
        try
        {
            Console.WriteLine($"第{index}次開始{DateTime.Now}");
            Thread.Sleep(2000);
            Console.WriteLine($"第{index}次結(jié)束{DateTime.Now}");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

到此這篇關(guān)于C#使用RabbitMQ發(fā)送和接收消息工具類的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# RabbitMQ發(fā)送和接收內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C# PC版微信消息監(jiān)聽自動回復(fù)的實現(xiàn)方法

    C# PC版微信消息監(jiān)聽自動回復(fù)的實現(xiàn)方法

    這篇文章主要介紹了C# PC版微信消息監(jiān)聽自動回復(fù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#調(diào)用Python程序傳參數(shù)獲得返回值

    C#調(diào)用Python程序傳參數(shù)獲得返回值

    C# 調(diào)用 Python 程序有多種方式,本文主要介紹了4種方式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#運行程序時阻止關(guān)閉顯示器和系統(tǒng)待機

    C#運行程序時阻止關(guān)閉顯示器和系統(tǒng)待機

    這篇文章介紹了C#運行程序時阻止關(guān)閉顯示器和系統(tǒng)待機的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#開發(fā)Winform實現(xiàn)學(xué)生管理系統(tǒng)

    C#開發(fā)Winform實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章介紹了C#開發(fā)Winform實現(xiàn)學(xué)生管理系統(tǒng)的項目案例,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C# winform程序讀取文本中的值實例講解

    C# winform程序讀取文本中的值實例講解

    在本篇文章中小編給大家分享了關(guān)于C# winform程序讀取文本中的值的相關(guān)知識點,有興趣的朋友們學(xué)習(xí)下。
    2019-06-06
  • C#獲取Word文檔中所有表格的實現(xiàn)代碼分享

    C#獲取Word文檔中所有表格的實現(xiàn)代碼分享

    這篇文章主要介紹了C#獲取Word文檔中所有表格的實現(xiàn)代碼分享,小編親測可用,需要的朋友可以參考下
    2014-09-09
  • 在C#中g(shù)lobal關(guān)鍵字的作用及其用法

    在C#中g(shù)lobal關(guān)鍵字的作用及其用法

    global 是 C# 2.0 中新增的關(guān)鍵字,理論上說,如果代碼寫得好的話,根本不需要用到它,但是不排除一些特別的情況,比如修改別人的代碼,本文僅舉例說明。
    2016-03-03
  • C#調(diào)用SQL語句時乘號的用法

    C#調(diào)用SQL語句時乘號的用法

    這篇文章主要介紹了C#調(diào)用SQL語句時乘號的用法,可避免因符號引起的程序錯誤,是C#程序設(shè)計人員有必要掌握的,需要的朋友可以參考下
    2014-08-08
  • C#?StackExchange.Redis?用法匯總

    C#?StackExchange.Redis?用法匯總

    StackExchange.Redis?是?C#?操作?Redis?數(shù)據(jù)庫的客戶端,本文通過圖文并茂的形式給大家介紹C#?StackExchange.Redis?用法匯總,感興趣的朋友一起看看吧
    2021-12-12
  • C# Socket文件上傳至服務(wù)器的操作方法

    C# Socket文件上傳至服務(wù)器的操作方法

    文件上傳有FTP、WebApi、WebService等等,這次我們來實現(xiàn)一個基于socket通信的本地客戶端上傳文件到服務(wù)器的例子,這篇文章主要介紹了C# Socket文件上傳至服務(wù)器的操作方法,需要的朋友可以參考下
    2024-05-05

最新評論