Exemple #1
0
 /// <summary>
 /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
 /// </summary>
 /// <returns></returns>
 public static RabbitMQClientHandler GetInstance(Odin.RabbitmqMessageCallback d, Odin.RabbitmqConnectCallback rbCon)
 {
     doWork = d;
     rabbitmqConnectCallback = rbCon;
     // 当第一个线程运行到这里时,此时会对locker对象 "加锁",
     // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
     // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
     // 双重锁定只需要一句判断就可以了
     if (uniqueInstance == null)
     {
         lock (locker)
         {
             // 如果类的实例不存在则创建,否则直接返回
             if (uniqueInstance == null)
             {
                 uniqueInstance = new RabbitMQClientHandler();
             }
         }
     }
     return(uniqueInstance);
 }
Exemple #2
0
        private static void RabbitmqMessageConsume(string queueName, Odin.RabbitmqMessageCallback doWork)
        {
            try
            {
                if (Connection == null || !Connection.IsOpen)
                {
                    throw new Exception("连接为空或连接已经关闭");
                }
                if (ListenChannel == null || !ListenChannel.IsOpen)
                {
                    throw new Exception("通道为空或通道已经关闭");
                }


                bool   queueDurable = true;
                string QueueName    = queueName;

                //在MQ上定义一个持久化队列,如果名称相同不会重复创建
                ListenChannel.QueueDeclare(QueueName, queueDurable, false, false, null);
                //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
                ListenChannel.BasicQos(0, 1, false);

                //创建基于该队列的消费者,绑定事件
                var consumer = new EventingBasicConsumer(ListenChannel);

                //回应消息监控
                //consumer.Received += SyncData_Received;

                consumer.Received += (model, e) =>
                {
                    try
                    {
                        //TOOD 验证程序退出后消费者是否退出去了
                        var body    = e.Body; //消息主体
                        var message = Encoding.UTF8.GetString(body);

                        //LogHelper.WriteLog("[x] 队列接收到消息:" + message.ToString());
                        if (e.DeliveryTag != deliveryTag)
                        {
                            deliveryTag = e.DeliveryTag;
                            doWork(message);
                        }
                        else
                        {
                            deliveryTag = e.DeliveryTag;
                            //未正常处理的消息,重新放回队列
                            ListenChannel.BasicReject(e.DeliveryTag, true);
                        }
                    }
                    catch (RabbitMQ.Client.Exceptions.OperationInterruptedException ex1)
                    {
                        Thread.Sleep(5000);
                        ListenChannel.BasicNack(e.DeliveryTag, false, true);
                    }
                    catch (Exception ex)
                    {
                        Thread.Sleep(5000);
                        ListenChannel.BasicNack(e.DeliveryTag, false, true);
                    }
                };

                //绑定消费者
                ListenChannel.BasicConsume(QueueName, //队列名
                                           false,     //false:手动应答;true:自动应答
                                           consumer);

                LogHelper.WriteLog("开始监控RabbitMQ服务器,队列" + QueueName);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }