Как создать издателя в консольном приложении - PullRequest
1 голос
/ 06 октября 2010

Я только начинаю с NServiceBus и обновил пример PubSub для работы с .NET 4.0 Framework. Это прекрасно работает. При этом запускается один издатель и два подписчика в среде «NServiceBus.Host.exe», поэтому именно он отвечает за настройку экземпляра шины и выполнение любых соответствующих подписок. Это все работает нормально (как и следовало ожидать), но сейчас я пытаюсь перевести издателя из-под запуска в "NServiceBus.Host.exe" в его собственное консольное приложение (в конце концов я хотел бы публиковать сообщения с веб-сайта, чтобы это кажется хорошим маленьким шагом в этом направлении).

Если я запускаю 3 проекта (мое консольное приложение, Sub1 и Sub2), он создает 5 msmq на моем локальном компьютере, но вместо подписки endpoint.config ... Q, он создает общий "nservicebus_subscription" Q. Если Я включаю журналы, я вижу, что MyPublisherInputQueue имеет три (обработанных) сообщения о завершении с кодом ошибки 0, в то время как в subscriber1inputqueue и subscriber2inputqueue есть одно. Все это кажется хорошим, но если я затем опубликую сообщения, издатель не выдаст никаких ошибок, но никакие сообщения не дойдут до подписчиков (они просто ждут сообщения). Также ни в новом сообщении, ни в журнале не отображаются сообщения ни для одного из MQ.

Я явно пропускаю некоторые шаги. Разве консольное приложение не открывается для подписок? Если да, какие шаги необходимы для этого? Какие шаги я пропускаю при запуске издателя в nservicebus.host.exe?

Чтобы создать консольное приложение, я сделал следующее:

  1. В рамках решения pubsub создано консольное приложение.
  2. Добавлены ссылки в консольном приложении на mymessages, nservicebus.dll и nservicebus.core.dll
  3. Из существующего кода паба и примера на веб-сайте NServiceBus добавили следующий код в «Main ()»

Код:

IBus Bus = Configure.With()
                    .Log4Net()
                    .DefaultBuilder()
                    .MsmqSubscriptionStorage()
                    .XmlSerializer()
                    .MsmqTransport()
                    .UnicastBus()
                        .LoadMessageHandlers()
                    .CreateBus()
                    .Start();

bool publishIEvent = true;
do
{
    Console.ReadLine();
    var eventMessage = publishIEvent ? Bus.CreateInstance<IEvent>() : new EventMessage();

    eventMessage.EventId = Guid.NewGuid();
    eventMessage.Time = DateTime.Now.Second > 30 ? (DateTime?)DateTime.Now : null;
    eventMessage.Duration = TimeSpan.FromSeconds(99999D);

    Bus.Send(eventMessage);

    Console.WriteLine("Published event with Id {0}.", eventMessage.EventId);

} while (true);
  1. Создание файла app.config для нового консольного приложения с использованием содержимого существующего приложения-издателя app.config.

  2. Добавлен «NServiceBus.Integration» в аргументы командной строки для проекта консольного приложения.

1 Ответ

1 голос
/ 06 октября 2010

Если вы посмотрите свои журналы, вполне вероятно, что NServiceBus говорит вам, что вам нужно настроить издателя на транзакционность.Способ сделать это - включить .IsTransactional (true) после .MsmqTransport ().

...