EasyNetQ с исключением службы Windows

Я запускаю простую службу Windows с EasyNetQ, но когда я пытаюсь опубликовать сообщение, я получаю исключение.

Исключение:

Pubisher confirms timed out after 10 seconds waiting for ACK or NACK from sequence

Вот мои тесты публикации:

try {       
    var queue = _bus.Advanced.QueueDeclare("api-request-history");        
    _bus.Send(queue.Name, message);

} catch (Exception e) {
    Logger.FatalException(string.Format("Message were not queued in queue: {0}", queue.Name), e);                
    OnErrorOccurred(e);     
} 

Вот мои тесты подписки:

public override void Subscribe(Action<IReceiveRegistration> execution) {
     var queue = _bus.Advanced.QueueDeclare("api-request-history");
     try {
         while (_bus.IsConnected) {
             _bus.Receive(queue.Name, execution);
         }
     } catch (Exception e) {
         Logger.ErrorException("Error occurred", e);
     } finally {
         if (_bus != null) {
             _bus.Dispose();
         }
     }
 }

Вот вызов подписки:

_queueConsumer.Subscribe(x => x.Add<ApiRequestHistory>(message => {
    Logger.Info("Initializing subscribtion sequence!");
    Logger.Info("Message data is being saved...");

    Execute();
    Logger.Info("Message data saving is completed!");
    Thread.Sleep(100);
    wait.Set();
}));
wait.Wait();

person IamStalker    schedule 27.02.2014    source источник


Ответы (1)


Я думаю, что вы подписываетесь неправильно. Вы не должны звонить _bus.Receive(queueName) более одного раза в одну и ту же очередь (из EasyNETQ документы):

Примечание. Вероятно, вы не хотите вызывать bus.Receive более одного раза для одной и той же очереди. Это создаст нового потребителя в очереди, и RabbitMQ будет циклически переключаться между ними. Если вы используете разные типы для разных вызовов Receive (и, следовательно, разных потребителей), некоторые из ваших сообщений окажутся в очереди ошибок, потому что EasyNetQ не найдет обработчик для вашего типа сообщений, связанный с потребителем, для которого оно используется.< /эм>

Просто сделайте это один раз, и ваши потребители (по типу) будут зарегистрированы.

Это особенно верно, поскольку кажется, что вы используете подтверждение издателя. Я не очень хорошо знаю ваш сценарий, но обычно в этом нет необходимости, если у вас нет модели транзакционных вызовов RPC.

Проверьте документы в подтверждении издателя.

person cvbarros    schedule 27.02.2014
comment
Как мне вызвать его из службы Windows ?? Он повторяется каждые 1000 мс, это означает, что он будет вызываться каждый раз при повторной инициализации. Можете ли вы предложить службу Windows с примером easynetq, который продемонстрирует, как это работает? - person IamStalker; 02.03.2014