2014-01-09 119 views
0

我是Rebus的新手。 有一個問題我想問:Rebus支持Web應用發佈消息並訂閱消息

  1. 這是一個好主意,使Web應用程序發佈消息和訂閱消息。 Rebus是否支持這個功能。

我測試Server mode,但它不起作用。它在Web應用程序啓動時只處理一條消息(來自pubsubsample.websubscriber1.input隊列)。 。

順便說一句,它運作良好,在單向的客戶端模式(發送短信只)

這裏是我的服務器模式的代碼段:

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

要回答你的第一個問題,滷麪是否支持出版,並從相同的過程訂閱,答案是肯定的 - 沒有技術理由,你爲什麼不能訂閱消息,並從相同的過程中發佈的消息相同,幷包括您的Web應用程序。

無論您應該是另一回事:)

在.NET Web應用程序是一種暫時性的,即他們在回收時,IIS決定它的時間來回收,然後它通常是不最好的辦法是訂閱郵件,因爲當一個事件發佈時你的應用程序可能不會運行,所以它不會處理它。

然後,當它由於IIS調度Web請求而被喚醒時,可能會有1,000,000個事件等待您的應用程序處理,這需要相當長的時間才能完成。

在某些情況下,我聽說有人希望在Web應用程序中使用Rebus pub/sub來保持Web應用程序中的緩存更新 - 但之後他們遇到了嚴重問題,這是因爲IIS支持重疊兩個同一個Web應用程序的實例 - 突然間,短時間內,兩個相同Web應用程序的實例正在運行,因此允許Web應用程序關閉以捕獲應該由新實例處理的一些事件。

由於這些原因,我一般會而不是推薦做pub/sub在web應用程序。

那麼,爲什麼你的酒吧/子的東西不工作?好 - 第一件事:創建它之後不要立即處理容器適配器! :)

而是執行此操作:

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()); 
} 

這樣,你巴士不會停止處理消息您的Web應用程序已經開始之後。

+0

太棒了!清楚的解釋!非常感謝你,祝你有美好的一天! – markchenwd