2010-10-06 3 views
1

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

Если я запускаю 3 проекта (мое консольное приложение, Sub1 и Sub2), он создает 5 мскм на моей локальной машине, но вместо endpoint.config ... subscriptions, он создает общий «nservicebus_subscriptions» Q. Если я включаю журналы, я вижу, что MyPublisherInputQueue имеет три (обработанных) сообщения о завершении с кодом ошибки 0, в то время как у каждого абонента и 1 подписчика есть 2 очереди. Все это кажется хорошим, но если я публикую сообщения, издатель, похоже, не выкидывает никаких ошибок, но никаких сообщений не доходят до подписчиков (они просто сидят в ожидании сообщения). Также никакие сообщения не появляются ни в новом сообщении, ни в журнале для любого из 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

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

+0

Отлично, это сработало - Спасибо. Это первый раз, когда я столкнулся с Log4Net тоже так определенно, столкнувшись с вертикальной кривой обучения - надеюсь, скоро дойду до точки, что я не буду чувствовать себя полным новичком. –

+0

Если ваша цель - настроить webapp для отправки сообщений, я бы сразу попытался это сделать. Веб-приложения не должны публиковать() сообщения в любом случае, просто Send(), поэтому хранить все ваши издатели, запущенные в NServiceBus.Host.exe, возможно, проще. Тогда ваш webapp не требует хранения подписки и т. Д. –

+0

@David: Итак, «правильная» модель предназначена для 1+ веб-приложений (возможно, для балансировки нагрузки?) Для отправки сообщений централизованному обработчику сообщений, который затем публикуется? Похоже, я должен провести некоторое время в эти выходные, глядя в «Отправить». –

Смежные вопросы