我正在使用nServivceBus将消息持久保存到Message Queue。我跑了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);
}
更新
目的是让网站将消息发送到消息队列和服务来处理消息。这很简单。我不是在寻找客户端和服务器之间的响应或通信。这是单向沟通。
答案 0 :(得分:2)
您似乎正在为输入队列和邮件路由配置使用相同的队列地址:
<MsmqTransportConfig InputQueue="subscribe" ...
and
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="Momntz" Endpoint="subscribe"/> ...
这不正确。 MsmqTransportConfig
部分定义了服务的本地输入队列。 UnicastBusConfig
部分定义了发送消息的目标地址。
你看过log4net默认生成的日志文件吗?那里可能会有一些错误信息。
您还定义了订阅队列:
<MsmqSubscriptionStorageConfig Queue="subscribe" />
这表明您希望自己的服务充当发布商。在这种情况下,您不会使用Bus.Send()
而是使用Bus.Publish()
,而且如果是这种情况,则您不需要将任何路由信息添加到UnicastBusConfig
部分,因为这将由NServiceBus中的发布/订阅功能。