2016-04-14 1 views
3

В чем причина следующего исключения при попытке Отложить отправку сообщения на одностороннем клиенте: System.InvalidOperationException «Нельзя использовать самих себя как диспетчер тайм-аут, потому что мы односторонний клиент »Почему я не могу отложить отправку сообщения для одностороннего клиента

ответ

1

Односторонний клиент - это клиент Rebus, который не способен принимать сообщения, поэтому у него нет очереди ввода.

Путь await bus.Defer(...) работает, отправив сообщение с some special headers в «диспетчер тайм-аута», который по умолчанию является конечной точкой, которая отсылает сообщение.

Но поскольку односторонний клиент не имеет входной очереди, ему некуда отправлять отправленное сообщение.

Вы можете сделать один-полосной клиент что отложить сообщения по настройке внешнего управляющего таймаутом как это:

Configure.With(...) 
    .(...) 
    .Options(o => o.UseExternalTimeoutManager(anotherQueue)) 
    .Start(); 

, который будет вызывать клиент, чтобы отправить отложенное сообщение в эту очередь.

Кроме, вам придется вручную установить заголовок rbs2-defer-recipient в какой-то другой входной очереди, так что менеджер тайм-аут знает, куда послать сообщение, когда пришло время, чтобы потребляться (*).

Надеюсь, что это объясняет :) Пожалуйста, дайте мне знать, если это неясно.


*) Это на самом деле не так с Ребусом 4, потому что bus.Defer использует нормальные отображения конечных точек для маршрутизации сообщений.

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