c# ActiveMq 使用

踩过的坑:

  坑1

            ActiveMq断网之后不会自动重连,需要将连接字符串修改为:failover:(tcp://192.168.0.47:61616)?randomize=false 

    如果有多个地址可以使用 逗号分隔,例如:failover:(tcp://192.168.0.47:61616,tcp://192.168.0.48:61616)?randomize=false

  坑2

    ActiveMq 分为 持久化、非持久化

    持久化: 程序关闭之后服务器发送消息会存在在消息队列中,再次上线后会将之前消息全部再次接收,

    非持久化:程序关闭后,再次上线后这段时间不会接收到历史消息,等于是从新开始

    

开撸

        private void CreateMq()
        {
            ActiveMqManager mq = new ActiveMqManager();
            mq.Listener += MqListener;
            mq.CreateTopic("termNotifyTopic");
        }

        private void MqListener(string message)
        {
            Console.WriteLine(message);
        }
需要引用DLL

https://files.cnblogs.com/files/zisai/ActiveMq.rar

 
ActiveMqManager源码
    public class ActiveMqManager
    {
        public delegate void ActiveHandle(string message);
        #region 属性

        IConnection _connection;
        /// <summary>
        /// 监听接收事件
        /// </summary>
        public event ActiveHandle Listener;
        /// <summary>
        /// MQ 连接地址
        /// </summary>
        public string BrokerUri { get; set; }
        /// <summary>
        /// 客户端名称标识
        /// </summary>
        public string ClientId { get; set; }
        /// <summary>
        /// 消费者 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 是否为 持久订阅者
        /// </summary>
        public bool Lasting { get; set; }
        #endregion

        public ActiveMqManager()
        {
            BrokerUri = AppConfig.MqUrl;
            ClientId = AppConfig.TermCode;
            Name = "Akeem";
        }
        public ActiveMqManager(string brokerUri, string clientId, string name)
        {
            BrokerUri = brokerUri;
            ClientId = clientId;
            Name = name;
        }

        /// <summary>
        /// 创建1对多消费模式
        /// </summary>
        /// <param name="topicName">广播ID</param>
        public void CreateTopic(string topicName)
        {
            if (_connection != null && _connection.IsStarted)
            {
                throw new Exception("已经存在一个连接");
            }
            //获取一个connection
            _connection = GetConnection();
            if (_connection == null) { return; }
            //启动连接,监听的话要主动启动连接
            _connection.Start();
            //通过连接创建一个会话
            ISession session = _connection.CreateSession();
            if (Lasting)
            {
                //通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置
                IMessageConsumer consumer = session.CreateDurableConsumer(new ActiveMQTopic(topicName), Name, null, false);
                //注册监听事件
                consumer.Listener += new MessageListener(consumer_Listener);
            }
            else
            {
                //创建topic
                ActiveMQTopic destination = new ActiveMQTopic(topicName);
                //普通消费者,即非持久订阅者
                var consumer = session.CreateConsumer(destination);
                consumer.Listener += new MessageListener(consumer_Listener);
            }
        }

        /// <summary>
        /// 创建1对1 消费模式
        /// </summary>
        public void CreateQueue(string queueName, string filter)
        {
            if (_connection != null && _connection.IsStarted)
            {
                throw new Exception("已经存在一个连接");
            }
            _connection = GetConnection();
            if (_connection == null) { return; }
            //启动连接,监听的话要主动启动连接
            _connection.Start();
            //通过连接创建一个会话
            ISession session = _connection.CreateSession();
            //通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置  例如:string.Format("filter='{0}'", this.txtID.Text)
            IMessageConsumer consumer = session.CreateConsumer(new ActiveMQQueue(queueName), filter);
            //注册监听事件
            consumer.Listener += new MessageListener(consumer_Listener);
        }

        private void Connection_ExceptionListener(Exception exception)
        {

        }

        private void Connection_ConnectionResumedListener()
        {

        }

        /// <summary>
        /// 连接中断监听器
        /// </summary>
        private void Connection_ConnectionInterruptedListener()
        {

        }

        private void consumer_Listener(IMessage message)
        {
            ITextMessage msg = (ITextMessage)message;
            Listener?.Invoke(msg.Text);
        }

        /// <summary>
        /// 创建连接器
        /// </summary>
        /// <returns></returns>
        private IConnection GetConnection()
        {
            try
            {
                //创建连接工厂
                IConnectionFactory factory = new ConnectionFactory(BrokerUri);
                //通过工厂构建连接
                var connection = factory.CreateConnection();
                //这个是连接的客户端名称标识
                connection.ClientId = ClientId;
                //监听连接中断事件
                connection.ConnectionInterruptedListener += Connection_ConnectionInterruptedListener;
                //监听连接恢复事件
                connection.ConnectionResumedListener += Connection_ConnectionResumedListener;
                //异常监听
                connection.ExceptionListener += Connection_ExceptionListener;

                return connection;
            }
            catch (Exception ex)
            {
                LogHelper.Error("MQ:GetConnection", ex);
                return null;
            }
        }
    }

 原文:https://www.cnblogs.com/zisai/p/11138879.html

转载于:https://www.cnblogs.com/zisai/p/11138879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Active是一个开源的消息中间件,它提供了可靠的消息传递、事务支持和高性能的异步通信。在C#使用ActiveMQ进行消息传递的教程如下: 1. 首先,你需要引入必要的命名空间和依赖包。在你的C#代码中,你需要引入System、Apache.NMS和Apache.NMS.ActiveMQ这三个命名空间,并通过NuGet安装依赖包Apache.NMS.ActiveMQ。 2. 创建生产者。在代码中,你需要创建一个ConnectionFactory对象,指定ActiveMQ的连接地址。然后,通过连接工厂创建一个Connection对象,在Connection对象上创建一个Session对象。接下来,使用Session对象创建一个MessageProducer对象,并指定要发送消息的目标(Topic或Queue)。最后,创建一个消息(可以是文本消息、字节消息等),并使用MessageProducer发送消息。 3. 创建消费者。在代码中,你需要创建一个ConnectionFactory对象,指定ActiveMQ的连接地址。然后,通过连接工厂创建一个Connection对象,在Connection对象上创建一个Session对象。接下来,使用Session对象创建一个MessageConsumer对象,并指定要接收消息的目标(Topic或Queue)。最后,使用MessageConsumer接收消息,并进行相关处理。 需要注意的是,生产者和消费者的目标(Topic或Queue)应该保持一致,以便生产者发送的消息可以被消费者接收到。 以上就是使用ActiveMQ进行消息传递的C#教程。你可以根据上述步骤来编写你的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值