nServiceBus не сохраняется в MessageQueue - PullRequest
0 голосов
/ 22 декабря 2011

Я использую nServivceBus для сохранения сообщения в очереди сообщений.Я запустил runmefirst.bat.Служба очереди сообщений успешно установлена.Когда я запускаю веб-приложение, частные очереди успешно создаются.

Когда я отправляю сообщение, оно не отображается в очереди сообщений.Ошибки не выбрасываются.Я в тупике.

Настройка

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

update

Цель заключается в том, чтобы веб-сайт отправлял сообщения в очередь сообщений и службу для обработки сообщений.Это очень простоЯ не ищу ответ или связь между клиентом и сервером.Это один из способов общения.

1 Ответ

2 голосов
/ 22 декабря 2011

Вы используете один и тот же адрес очереди для входной очереди и для конфигурации маршрутизации сообщений:

<MsmqTransportConfig InputQueue="subscribe" ...

and

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

Это не правильно. Раздел MsmqTransportConfig определяет локальную очередь ввода вашего сервиса. Раздел UnicastBusConfig определяет адресацию получателя для отправки сообщений.

Вы смотрели файл журнала, который по умолчанию генерируется log4net? Там, вероятно, будет некоторая информация об ошибке.

Вы также определили очередь подписки:

<MsmqSubscriptionStorageConfig Queue="subscribe" />

Это говорит о том, что вы хотите, чтобы ваша служба выступала в качестве издателя. В этом случае вы бы не использовали Bus.Send(), но Bus.Publish(), и более того, если бы это было так, вам не нужно было бы добавлять какую-либо информацию о маршрутизации в раздел UnicastBusConfig, потому что это будет обрабатываться функцией публикации / подписки в NServiceBus.

...