現象:
消息隊列在處理完一條消息后,無法繼續監聽后續消息。
首先,系統啟動時要啟動接收方法如下:

1 protected void Application_Start() 2 { 3 RouteTable.Routes.MapHubs(); 4 AreaRegistration.RegisterAllAreas(); 5 6 RegisterGlobalFilters(GlobalFilters.Filters); 7 RegisterRoutes(RouteTable.Routes); 8 Register(GlobalConfiguration.Configuration); 9 //GlobalHost.ConnectionManager.GetHubContext<ProcessMonitoring>().Clients.All.receive("ss"); 10 //RouteTable.Routes.MapHubs(); 11 ReceiveSuccessMessage(); 12 }
其次,接收方法如下,

1 /// <summary> 2 /// 反饋成功的消息隊列 3 /// </summary> 4 public static void ReceiveSuccessMessage() 5 { 6 ConnectionFactory factory = CreateConnectionFactory(); 7 using (var connection = factory.CreateConnection()) 8 { 9 using (var channel = connection.CreateModel()) 10 { 11 //輸入1,那如果接收一個消息,但是沒有應答,則客戶端不會收到下一個消息 12 channel.BasicQos(0, 1, false); 13 var consumer = new EventingBasicConsumer(channel); 14 channel.BasicConsume(receiveQueueSuccess, false, consumer); 15 consumer.Received += (model, ea) => 16 { 17 try 18 { 19 var body = ea.Body; 20 var message = Encoding.UTF8.GetString(body); 21 22 //反饋信息處理 23 ProcessFeedbackInfoForQueue(message); 24 channel.BasicAck(ea.DeliveryTag, false); 25 } 26 catch (Exception ex) 27 { 28 Yingu.Common.SysLog.Write("接受消息隊列失敗:", string.Format("反饋成功消息隊列 時間:{0} :失敗原因{1}", DateTime.Now, ex.Message + ex.StackTrace)); 29 channel.BasicAck(ea.DeliveryTag, false); 30 } 31 }; 32 33 }; 34 35 }; 36 }
解決方法:
將第二個方法改為

1 /// <summary> 2 /// 反饋成功的消息隊列 3 /// </summary> 4 public static void ReceiveSuccessMessage() 5 { 6 ConnectionFactory factory = CreateConnectionFactory(); 7 var connection = factory.CreateConnection(); 8 var channel = connection.CreateModel(); 9 //輸入1,那如果接收一個消息,但是沒有應答,則客戶端不會收到下一個消息 10 channel.BasicQos(0, 1, false); 11 var consumer = new EventingBasicConsumer(channel); 12 channel.BasicConsume(receiveQueueSuccess,false,consumer); 13 consumer.Received += (model, ea) => 14 { 15 try 16 { 17 var body = ea.Body; 18 var message = Encoding.UTF8.GetString(body); 19 20 //反饋信息處理 21 ProcessFeedbackInfoForQueue(message); 22 channel.BasicAck(ea.DeliveryTag, false); 23 } 24 catch (Exception ex) 25 { 26 Yingu.Common.SysLog.Write("接受消息隊列失敗:", string.Format("反饋成功消息隊列 時間:{0} :失敗原因{1}", DateTime.Now, ex.Message + ex.StackTrace)); 27 channel.BasicAck(ea.DeliveryTag, false); 28 } 29 }; 30 }
原因是每次處理一條消息后,接收方法會斷開連接,無法繼續監聽后續消息。