nServiceBus 没有持久化到 MessageQueue
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的输入队列和消息路由配置似乎使用相同的队列地址:
这是不正确的。
MsmqTransportConfig
部分定义服务的本地输入队列。UnicastBusConfig
部分定义发送消息的目标地址。你看过log4net默认生成的日志文件吗?里面可能会有一些错误信息。
您还定义了一个订阅队列:
这表明您希望您的服务充当发布者。在这种情况下,您不会使用
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:
This is not correct. The
MsmqTransportConfig
section defines your service's local input queue. TheUnicastBusConfig
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:
This suggests that you want your service to act as a publisher. In this case you would not use
Bus.Send()
butBus.Publish()
, and furthermore if this were the case then you would not need to add any routing information into theUnicastBusConfig
section because this would be handled by the publish/subscribe functionality in NServiceBus.