【问题标题】:nServiceBus is not persisting to the MessageQueuenServiceBus 没有持久化到 MessageQueue
【发布时间】:2011-12-22 00:35:40
【问题描述】:

我正在使用 nServivceBus 将消息持久保存到消息队列。我已经运行了 runmefirst.bat。消息队列服务安装成功。当我运行 Web 应用程序时,私有队列已成功创建。

当我发送消息时,它没有显示在消息队列中。没有错误被抛出。我被难住了。

设置

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

更新

目的是让网站将消息发送到消息队列和处理消息的服务。这很简单。我不是在寻找客户端和服务器之间的响应或通信。这是一种沟通方式。

【问题讨论】:

  • 你说你是“使用 nServivceBus 将消息持久化到消息队列”,我也有点困惑。将消息持久化到 MSMQ 队列是传输级别的细节,而不是最终结果。如果您告诉我们您实际想要达到的目标,这将是有用的。

标签: message-queue nservicebus


【解决方案1】:

您的输入队列和消息路由配置似乎使用相同的队列地址:

<MsmqTransportConfig InputQueue="subscribe" ...

and

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

这是不正确的。 MsmqTransportConfig 部分定义了服务的本地输入队列。 UnicastBusConfig 部分定义发送消息的目标地址。

你看过log4net默认生成的日志文件吗?里面可能会有一些错误信息。

您还定义了一个订阅队列:

<MsmqSubscriptionStorageConfig Queue="subscribe" />

这表明您希望您的服务充当发布者。在这种情况下,您不会使用Bus.Send(),而是使用Bus.Publish(),此外,如果是这种情况,那么您不需要将任何路由信息添加到UnicastBusConfig 部分,因为这将由发布/订阅功能处理NServiceBus。

【讨论】:

  • 感谢您的浏览。我是 nServiceBus 和基于消息的架构的新手。我已在帖子中添加了更新。
猜你喜欢
  • 1970-01-01
  • 2016-12-30
  • 2012-02-13
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2014-09-02
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多