nServiceBus 没有持久化到 MessageQueue

发布于 2024-12-22 21:22:31 字数 2738 浏览 1 评论 0原文

我正在使用 nServicceBus 将消息保存到消息队列。我已经运行了 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);
}

更新

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

I'm using nServivceBus to persist a message to the Message Queue. I've ran the runmefirst.bat. The messagequeue servivce is successfully installed. When I run the web application the private queues are successfully created.

When I send the message, it's not showing up in the Message Queue. No errors are thrown. I'm stumped.

Setup

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

Config

<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>

Code

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

update

The intent is for a website to send messages to a message queue and a service to process the messages. It's very simple. I'm not looking for a response or communication between the client and server. It's one way communication.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赴月观长安 2024-12-29 21:22:31

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

<MsmqTransportConfig InputQueue="subscribe" ...

and

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

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

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

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

<MsmqSubscriptionStorageConfig Queue="subscribe" />

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

You appear to be using the same queue address for your input queue and for your message routing config:

<MsmqTransportConfig InputQueue="subscribe" ...

and

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

This is not correct. The MsmqTransportConfig section defines your service's local input queue. The UnicastBusConfig section defines the destination addressing for sending messages.

Have you looked at the logfile which is generated by default by log4net? There will probably be some error information in there.

You also have defined a subscription queue:

<MsmqSubscriptionStorageConfig Queue="subscribe" />

This suggests that you want your service to act as a publisher. In this case you would not use Bus.Send() but Bus.Publish(), and furthermore if this were the case then you would not need to add any routing information into the UnicastBusConfig section because this would be handled by the publish/subscribe functionality in NServiceBus.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文