2011-12-22 34 views
0

我正在使用nServivceBus將消息保留到消息隊列中。我跑了runmefirst.bat。消息隊列服務已成功安裝。當我運行Web應用程序時,私有隊列被成功創建。nServiceBus不是持久化到MessageQueue

當我發送消息時,它沒有顯示出來在消息隊列。沒有錯誤被拋出。我很難過。

設置

Configure config = Configure.WithWeb(); 
    config 
     .StructureMapBuilder(Container) 
     .MsmqSubscriptionStorage() 
     .MsmqTransport() 
      .IsTransactional(true) 
      .PurgeOnStartup(false) 
     .XmlSerializer() 
     .UnicastBus() 
      .ImpersonateSender(false) 
     .CreateBus() 
     .Start(); 

配置

<configuration> 
    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <MsmqSubscriptionStorageConfig Queue="subscribe" /> 
    <MsmqTransportConfig InputQueue="subscribe" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"/> 
    <UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="Momntz" Endpoint="subscribe"/> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

代碼

private readonly IDocumentDatabase _database; 
private readonly IBus _bus; 

/// <summary> 
/// Initializes a new instance of the <see cref="HomeIndexCommandHandler"/> class. 
/// </summary> 
/// <param name="database">The database.</param> 
/// <param name="bus"></param> 
public CreateUserCommandHandler(IDatabases database, IBus bus) 
{ 
    _database = database.RavenDb; 
    _bus = bus; 
} 

/// <summary> 
/// Executes the specified command. 
/// </summary> 
/// <param name="command">The command.</param> 
public void Execute(CreateUserCommand command) 
{ 
    var user = Mapper.DynamicMap<CreateUserCommand, User>(command); 
    user.AccountStatus = UserAccountStatus.Active; 

    var foundUser = CheckForDuplicateUsername(user); 

    if(foundUser != null) 
    { 
     throw new DuplicateUsernameException(string.Format("Username '{0}' already exists.", user.Username)); 
    } 

    _database.Add(user); 

    var denormalizeMessage = Mapper.DynamicMap<User, UserDenormalizeMessage>(user); 
    _bus.Send(denormalizeMessage); 
} 

更新

這樣做的目的是爲網站將消息發送到消息隊列和處理消息的服務。這很簡單。我不在尋找客戶端和服務器之間的響應或通信。這是一種溝通方式。

+0

我也有點茫然,你說你是*「使用nServivceBus堅持一個消息到消息隊列」 *。消息持續到MSMQ隊列是一個傳輸級別的細節,而不是結束遊戲。如果你告訴我們你實際想要達到的目標,那麼有用的是什麼。 – 2011-12-22 09:13:06

回答

2

你似乎是使用同一隊列的地址爲您輸入隊列,併爲您的郵件路由設置:

<MsmqTransportConfig InputQueue="subscribe" ... 

and 

<UnicastBusConfig> 
    <MessageEndpointMappings> 
    <add Messages="Momntz" Endpoint="subscribe"/> ... 

這是不正確的。 MsmqTransportConfig部分定義了您的服務的本地輸入隊列。 UnicastBusConfig部分定義了發送消息的目標地址。

你看這是默認生成的log4net的日誌文件?那裏可能會有一些錯誤信息。

您還定義了訂閱隊列:

<MsmqSubscriptionStorageConfig Queue="subscribe" /> 

這表明你希望你的服務作爲一個出版商。在這種情況下,你不會用Bus.Send()Bus.Publish(),而且如果是這樣的話,那麼你就不需要任何路由信息加入到UnicastBusConfig部分,因爲這將在NServiceBus發佈/訂閱功能來處理。

+0

感謝您的關注。我是nServiceBus和基於消息的體系結構的新手。我已添加了該帖子的更新。 – 2011-12-22 18:43:50