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.
You appear to be using the same queue address for your input queue and for your message routing config:
This is not correct. The
MsmqTransportConfigsection defines your service’s local input queue. TheUnicastBusConfigsection 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 theUnicastBusConfigsection because this would be handled by the publish/subscribe functionality in NServiceBus.