Я только начинаю с 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?
Чтобы создать консольное приложение, я сделал следующее:
- В рамках решения pubsub создано консольное приложение.
- Добавлены ссылки в консольном приложении на mymessages, nservicebus.dll и nservicebus.core.dll
- Из существующего кода паба и примера на веб-сайте 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);
Создание файла app.config для нового консольного приложения с использованием содержимого существующего приложения-издателя app.config.
Добавлен «NServiceBus.Integration» в аргументы командной строки для проекта консольного приложения.