2015-02-14 3 views
1

Я использую RabbitMQ для обеспечения потребления предметов из очереди. Мое приложение обрабатывается службой Windows, которое выполняется большую часть времени.RabbitMQ останавливается в ожидании сообщений

на обслуживание START (OnStart) Я с использованием метода

while (true) 
{ 
    var ea =(BasicDeliverEventArgs)consumer.Queue.Dequeue(); 
    // ... Handle this item 
} 

Для того, чтобы потреблять элемент из очереди. Функция 'Dequeue()' блокируется. Поток будет заблокирован в этой строке, пока не появится какой-либо элемент.

Моя проблема начинается, когда я пытаюсь реализовать метод OnStop моего сервиса. Моя цель - прекратить ждать новых элементов, когда поступит сигнал OnStop. Итак, я модифицировал свой код примерно так:

while (true) 
{ 
    if (this.IsStopping) 
     return; // OnStop signal arrived. Stop waiting. 
    var ea =(BasicDeliverEventArgs)consumer.Queue.Dequeue(); 
    // ... Handle this item 
} 

В некоторых случаях код выше работает нормально. НО, если очередь пуста, выполнение службы Windows не произойдет.

Как вы рекомендуете мне решить эту проблему?

ответ

2

у вас есть два способа сделать это, первый из них называется «яд сообщение», во время службы остановки вы отправляете сообщение в очереди:

while (true) 
{ 
    var ea =(BasicDeliverEventArgs)consumer.Queue.Dequeue(); 
    // ... Handle this item 
    if (mymessage is MyPoisonMessage) 
    break; 
} 

На самом деле я не люблю, но это быстрое решение.

Еще один является расширить класс DefaultBasicConsumer, а затем использовать потребительский тег, чтобы закрыть потребитель, что-то вроде этого:

class SampleConsumer : DefaultBasicConsumer 
    { 

     public SampleConsumer(IModel channel) : base(channel) 
     { 
     } 

     public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, 
      IBasicProperties properties, byte[] body) 
     { 
..... 

Затем экземпляр класса, получить consumerTag и закрыть его таким образом:

channel.BasicCancel(consumerTag) 

надеюсь, что это поможет.

Смежные вопросы