2011-12-22 48 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