rabbitHelper

129 阅读2分钟

概述

c# 连接rabbitMq helper类型。

nuget下载包 RabbitMQ.Client

RabbitHelper

using ***.SCM.Core.Services.mq;
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 public class RabbitmqHelper
    {
        private static log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        private RabbitmqConType _connectionType;
        private IConnection _connection;
        private IModel channel;


        public RabbitmqHelper(RabbitmqConType connectionType)
        {
            _connectionType = connectionType;
        }

        public IConnection getConnection()
        {
            if (RabbitmqConType.SysRabbitmq == _connectionType)
            {
                var uri = new Uri(RabbitmqConfig.sys_rabbitmq_address);
                var factory = new ConnectionFactory
                {
                    UserName = RabbitmqConfig.sys_rabbitmq_username,
                    Password = RabbitmqConfig.sys_rabbitmq_password,
                    VirtualHost = RabbitmqConfig.sys_rabbitmq_virtualhost,
                    RequestedHeartbeat = 0,
                    Endpoint = new AmqpTcpEndpoint(uri),
                    AutomaticRecoveryEnabled = true
                };
                var connection = factory.CreateConnection("scm.sys.connection");
                this._connection = connection;
                return connection;
            }
            else if (RabbitmqConType.MdsRabbitmq == _connectionType)
            {
                var uri = new Uri(RabbitmqConfig.mds_rabbitmq_address);
                var factory = new ConnectionFactory
                {
                    UserName = RabbitmqConfig.mds_rabbitmq_username,
                    Password = RabbitmqConfig.mds_rabbitmq_password,
                    VirtualHost = RabbitmqConfig.mds_rabbitmq_virtualhost,
                    RequestedHeartbeat = 0,
                    Endpoint = new AmqpTcpEndpoint(uri),
                    AutomaticRecoveryEnabled = true
                };
                var connection = factory.CreateConnection("scm.mds.connection");
                this._connection = connection;
                return connection;

            }
            else if (RabbitmqConType.ScmRabbitmq == _connectionType)
            {
                var uri = new Uri(RabbitmqConfig.scm_rabbitmq_address);
                var factory = new ConnectionFactory
                {
                    UserName = RabbitmqConfig.scm_rabbitmq_username,
                    Password = RabbitmqConfig.scm_rabbitmq_password,
                    VirtualHost = RabbitmqConfig.scm_rabbitmq_virtualhost,
                    RequestedHeartbeat = 0,
                    Endpoint = new AmqpTcpEndpoint(uri),
                    AutomaticRecoveryEnabled = true
                };
                var connection = factory.CreateConnection("scm.connection");
                this._connection = connection;
                return connection;
            }
            return null;
        }


        /// <summary>
        /// 获取channel
        /// </summary>
        /// <returns></returns>
        public IModel getChannel()
        {
            if (_connection == null || channel == null || !_connection.IsOpen || !channel.IsOpen)
            {
                getConnection();
                channel = _connection.CreateModel();

                //if (RabbitType.sys_rabbitmq == _rabbitType)
                //{
                //    var uri = new Uri(RabbitmqConfig.sys_rabbitmq_address);
                //    var factory = new ConnectionFactory
                //    {
                //        UserName = RabbitmqConfig.sys_rabbitmq_username,
                //        Password = RabbitmqConfig.sys_rabbitmq_password,
                //        VirtualHost = RabbitmqConfig.sys_rabbitmq_virtualhost,
                //        RequestedHeartbeat = 0,
                //        Endpoint = new AmqpTcpEndpoint(uri)
                //    };
                //    _connection = factory.CreateConnection();
                //    channel = _connection.CreateModel();
                //}
                //if (RabbitType.mds_rabbitmq == _rabbitType)
                //{
                //    var uri = new Uri(RabbitmqConfig.mds_rabbitmq_address);
                //    var factory = new ConnectionFactory
                //    {
                //        UserName = RabbitmqConfig.mds_rabbitmq_username,
                //        Password = RabbitmqConfig.mds_rabbitmq_password,
                //        VirtualHost = RabbitmqConfig.mds_rabbitmq_virtualhost,
                //        RequestedHeartbeat = 0,
                //        Endpoint = new AmqpTcpEndpoint(uri)
                //    };
                //    _connection = factory.CreateConnection();
                //    channel = _connection.CreateModel();
                //}
                //if (RabbitType.scm_rabbitmq == _rabbitType)
                //{
                //    var uri = new Uri(RabbitmqConfig.scm_rabbitmq_address);
                //    var factory = new ConnectionFactory
                //    {
                //        UserName = RabbitmqConfig.scm_rabbitmq_username,
                //        Password = RabbitmqConfig.scm_rabbitmq_password,
                //        VirtualHost = RabbitmqConfig.scm_rabbitmq_virtualhost,
                //        RequestedHeartbeat = 0,
                //        Endpoint = new AmqpTcpEndpoint(uri)
                //    };
                //    _connection = factory.CreateConnection();
                //    channel = _connection.CreateModel();
                //}

            }
            return channel;
        }


        /// <summary>
        /// 释放channel
        /// </summary>
        public void disposeChannel()
        {
            if (_connection == null || channel == null || !_connection.IsOpen || !channel.IsOpen)
            {
                _connection.Dispose();
                channel.Dispose();
            }
        }
    }

RabbitmqConType

    /// <summary>
    /// rabbitmq连接类型
    /// </summary>
    public enum RabbitmqConType
    {
        /// <summary>
        /// Sys-rabbitmq
        /// </summary>
        SysRabbitmq = 0,

        /// <summary>
        /// Mds-rabbitmq
        /// </summary>
        MdsRabbitmq = 1,

        /// <summary>
        /// scm-rabbitmq
        /// </summary>
        ScmRabbitmq = 2,

    }

web.config

 <add key="sys_rabbitmq_address" value="amqp://127.0.0.1:5672/,amqp://127.0.0.2:5672/,amqp://127.0.0.3:5672//>
    <add key="sys_rabbitmq_username" value="1"/>
    <add key="sys_rabbitmq_password" value="1"/>
    
    <add key="mds_rabbitmq_address" value="amqp://127.0.0.1:5672/,amqp://127.0.0.2:5672/,amqp://127.0.0.3:5672/"/>
    <add key="mds_rabbitmq_username" value="1"/>
    <add key="mds_rabbitmq_password" value="1"/>
    <add key="mds_rabbitmq_virtualhost" value="mds"/>
    
        <add key="scm_rabbitmq_address" value="amqp://127.0.0.1:5672/,amqp://127.0.0.2:5672/,amqp://127.0.0.3:5672/"/>
    <add key="scm_rabbitmq_username" value="1"/>
    <add key="scm_rabbitmq_password" value="1"/>
    <add key="scm_rabbitmq_virtualhost" value="scm"/>
    

创建队列交换机

 //参数1(String queue):指定队列的名称,如果队列不存在,则会自动创建一个队列,名称为传入的queue;
        //参数2(boolean druable):定义队列特性是否需要持久化,如果为false,即在下一次启动mq时,队列会被删除。如果为true,下一次启动时,队列仍会存在,但需要注意的是,队列中的消息不会保留,下一次启动时,队列为空。                                                         如果需要消息的持久化,可以在利用basicPublish函数传递消息时,指明MessageProperties.PERSISTENT_TEXT_PLAIN,下次启动时,会恢复队列中的消息。
        //参数3(boolean exclusive):是否独占队列,如果为true,则该队列只能与当前的通道绑定,其他的通道访问不了该队列
        //参数4(boolean autoDelete):是否自动删除,在消费者消费完队列中的数据并与该队列连接断开时,是否要删除该队列
        //参数5(Map < String, Object > arguments):额外参数设置
 RabbitmqHelper scmRabbitHelper = new RabbitmqHelper(RabbitmqConType.ScmRabbitmq);
            var channel = scmRabbitHelper.getChannel();
            channel.ExchangeDeclare(exchange: RabbitmqConfig.scm_letsign_exchange, type: ExchangeType.Fanout, durable: true, autoDelete: false, arguments: null);            
            //自动签署
            channel.QueueDeclare(queue: RabbitmqConfig.scm_autosign_queue, durable: true, exclusive: false, autoDelete: false, arguments: null);            
            channel.QueueBind(queue: RabbitmqConfig.scm_autosign_queue, exchange: RabbitmqConfig.scm_letsign_exchange, routingKey: RabbitmqConfig.scm_autosign_queue, arguments: null);