2012-01-19 34 views
0

我在ASP.NET MVC3上測試NServiceBus。目前,我能夠將命令消息發送到後端,並且消息處理程序正在監聽它。但是,當我嘗試發佈相同的消息時,消息處理程序不在監聽。用戶無法處理來自發布者的消息

我發現的問題是該消息未發佈到訂閱者的隊列中。當我調試和檢查NServiceBusHost控制檯,它說

2012-01-19 22:53:35,042 [1] INFO NServiceBus.Unicast.UnicastBus [(null)] <(null 
)> - Subscribing to SampleMessage.Person1WasCreated, SampleMessage, Version=1.0. 
0.0, Culture=neutral, PublicKeyToken=null at publisher queue Test-web 

我一遍又一遍地檢查了我的配置設置了幾天,對我來說似乎是正確的。任何人都可以請檢查我缺少的東西嗎?我試圖做的事情是從Web發佈消息,並且消息應該在後端處理(ServiceHost2)。

ASP.NET MVC3的Web.config

<configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/> 
    </configSections> 
    <MsmqTransportConfig InputQueue="Test-web" ErrorQueue="Test-web-error" NumberOfWorkerThreads="1" MaxRetries="5" /> 
    <MsmqSubscriptionStorageConfig Queue="Test-subscriptionstorage" /> 

的Global.asax.cs

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 

      Global.Bus = Configure.WithWeb() 
       .Log4Net() 
       .CastleWindsorBuilder() 
       .XmlSerializer() 
       .MsmqTransport().IsTransactional(false) 
       .UnicastBus() 
       .LoadMessageHandlers() 
       .MsmqSubscriptionStorage() 
       .CreateBus() 
       .Start() 
       ; 
     } 

App.Config中的ServiceHost2項目

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    </configSections> 
    <MsmqSubscriptionStorageConfig Queue="Service2-AC1-subscriptionstorage" /> 
    <MsmqTransportConfig InputQueue="Service2-AC1" ErrorQueue="Service2-AC1-Error" NumberOfWorkerThreads="1" MaxRetries="5" /> 
    <UnicastBusConfig> 
    <MessageEndpointMappings> 
    <add Messages="SampleMessage" Endpoint="Test-web" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
    <appSettings> 
    <add key="EndpointConfigurationType" value="ServiceHost2.EndpointConfig, ServiceHost2"/> 
    </appSettings> 
</configuration> 

EndpointConfig爲ServiceHost2

namespace ServiceHost2 
{ 
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
    { 
     public void Init() 
     { 
      Configure.With() 
       .Log4Net() 
       .CastleWindsorBuilder() 
       .MsmqTransport() 
       .MsmqSubscriptionStorage() 
       .XmlSerializer() 
       .UnicastBus().LoadMessageHandlers() 
       ; 
     } 
    } 
} 

方法,其中發佈消息

public ActionResult CreatePerson(Person p) 
     { 
      var Person1WasCreated = new Person1WasCreated {Id = p.Id,Name = p.Name}; 
      Global.Bus.Publish(Person1WasCreated); 
      return View(); 
     } 

由於控制器。

+0

我看不到任何明顯的錯誤,你的日誌輸出會顯示你實際上正在訂閱事件......你確定它沒有發佈嗎?檢查您的訂閱隊列,看看是否有訂閱? – JimmyP

+0

我再次檢查,它不在那裏。它說我訂閱了消息,但訂閱存儲「Service2-AC1-subscriptionstorage」中沒有任何值。很奇怪。僅供參考,使用NServiceBus 2.6 – kekewong

+0

Subcribers存儲在發佈方(您的網站)。檢查Test-subscrptionstorage隊列? –

回答

0

我想我找到了原因。我今天在這篇文章上看到關於Why not publish NServiceBus messages from a web application?

它說得很清楚,消息不是假設從網上發佈。不知怎的,我的web項目創建的訂閱存儲不允許任何內容訂閱它。

所以我的解決方案是,我從Web發送命令消息到Service1中的消息處理程序,並將新的事件消息發佈到Service2。即使事件消息也可以訂閱到Service1的訂閱存儲。現在一切正常。謝謝。

相關問題