public static int run(Main.RabbitmqMessageCallback doWork) { try { var factory = new ConnectionFactory() { HostName = ConfigurationManager.AppSettings["HostName"].Trim(), //"192.168.31.157", UserName = ConfigurationManager.AppSettings["UserName"].Trim(), //"admin",//用户名 Password = ConfigurationManager.AppSettings["Password"].Trim(), //"admin",//密码 VirtualHost = ConfigurationManager.AppSettings["VirtualHost"].Trim(), //"my_vhost" }; factory.AutomaticRecoveryEnabled = true; var connection = factory.CreateConnection(); var channel = connection.CreateModel(); channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: true); #region EventingBasicConsumer //定义消费者 var consumer = new EventingBasicConsumer(channel); //接收到消息时执行的任务 consumer.Received += (model, ea) => { string message = Encoding.UTF8.GetString(ea.Body); if (ea.DeliveryTag != deliveryTag) { deliveryTag = ea.DeliveryTag; doWork(message); } else { deliveryTag = ea.DeliveryTag; status = statusEnum.REPULSE; channel.BasicNack(ea.DeliveryTag, false, true); } }; //处理消息 channel.BasicConsume(queue: "work", false, consumer: consumer); return(1); #endregion } catch (Exception er) { return(0); } }
/// <summary> /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点 /// </summary> /// <returns></returns> public static RabbitMQClientHandler GetInstance(Main.RabbitmqMessageCallback d, Main.RabbitmqConnectCallback rbCon) { doWork = d; rabbitmqConnectCallback = rbCon; // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" // 双重锁定只需要一句判断就可以了 if (uniqueInstance == null) { lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new RabbitMQClientHandler(); } } } return(uniqueInstance); }
private static void RabbitmqMessageConsume(string queueName, Main.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; } }