2014-01-09 1 views
0

Я новичок в Rebus. Есть один вопросы я хочу спросить:Поддерживает ли Rebus сообщение о публикации веб-приложения и подписывается на сообщение

  1. Это хорошая идея, чтобы сделать веб-приложение, публиковать сообщения и подписаться на сообщения. И поддерживает ли Rebus эти функции.

Я проверяю Server mode, однако он не работает. Он обрабатывает сообщение только одним сообщением (из очереди pubsubsample.websubscriber1.input) при запуске веб-приложения. .

BTW, это хорошо работает на клиентском режиме Односторонняя (Отправить сообщение только)

Вот мой сегмент кода для режима сервера:

public class CheckStatus : IHandleMessages<NewTradeRecorded> 
{ 
    readonly IBus bus; 

    public CheckStatus(IBus bus) 
    { 
     this.bus = bus; 
    } 

    public void Handle(NewTradeRecorded message) 
    { 

    } 
} 

Asp.net MVC

protected void Application_Start() 
    { 

     using (var adapter = new BuiltinContainerAdapter()) 
     { 
      adapter.Register(() => new CheckStatus(adapter.Bus)); 

      Configure.With(adapter) 
        .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 
        .MessageOwnership(o => o.FromRebusConfigurationSection()) 
        .CreateBus() 
        .Start(); 

      adapter.Bus.Subscribe<NewTradeRecorded>(); 

     } 
    } 

web.config

<rebus inputQueue="pubsubsample.websubscriber1.input" errorQueue="pubsubsample.websubscriber1.error" workers="1" maxRetries="5"> 
<endpoints> 
    <add messages="Trading.Messages" endpoint="trading.input"/> 
</endpoints> 

ответ

3

Чтобы ответить на ваш первый вопрос, поддерживает ли Ребус публикации и подписки от того же процесса, ответ да - нет никаких технических причин, почему вы не можете подписаться на сообщения и публиковать одни и те же сообщения из того же процесса , и это включает ваше веб-приложение.

ли вы должны другое дело :)

веб-приложения в .NET являются своего рода переходного процесса в природе, т.е. они возвращают, когда IIS решает, что пришло время, чтобы переработать, а затем, как правило, не Лучше всего подписаться на сообщения, потому что ваше приложение может не работать при публикации события, поэтому его не нужно обрабатывать.

И после этого, когда он просыпается, поскольку IIS отправляет ему веб-запрос, у вас может быть 1000 000 событий, ожидающих обработки вашего приложения, что займет довольно много времени, чтобы прожевать.

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

По этим причинам, в целом я бы не recomment делать pub/sub в веб-приложениях.

Итак, Почему ваш паб/суба не работает? Ну, во-первых: Не устанавливайте адаптер контейнера сразу после его создания! :)

ли это вместо:

static readonly _stuffToDispose = new List<IDisposable>(); 

protected void Application_Start() 
{ 
    var adapter = new BuiltinContainerAdapter(); 

    _stuffToDispose.Add(adapter); 

    adapter.Register(() => new CheckStatus(adapter.Bus)); 

    Configure.With(adapter) 
      .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 
      .MessageOwnership(o => o.FromRebusConfigurationSection()) 
      .CreateBus() 
      .Start(); 

    adapter.Bus.Subscribe<NewTradeRecorded>(); 
} 

protected void Application_End() 
{ 
    _stuffToDispose.ForEach(d => d.Dispose()); 
} 

Таким образом, вы шина не остановит обработку сообщений сразу после того, как ваш веб-приложение началось.

+0

Отлично! Ясное объяснение! Большое вам спасибо и приятный день! – markchenwd