2016-05-11 2 views
1

У меня возникли проблемы с ребусом.Обработчик сообщений не активируется

Вот мой сценарий. У нас есть три услуги

Идентичность) опубликованных сообщений 'IdentityCreated'

шлюз) посылает 'UpdateProfileCommand' непосредственно в 'Профиль-westeu-вход' очереди

Профиль) Потребляет сообщения из входной очереди «profile-westeu-input» и подписывается на сообщения «IdentityCreated»

Конфигурация ребуса видна в Служба профилей

Учитывая, что я зарегистрировал своих обработчиков с помощью виндзора замка.

container.Register(Classes.FromThisAssembly() 
        .BasedOn(typeof(IHandleMessages<>)) 
        .WithServiceAllInterfaces() 
        .LifestyleTransient()); 

И я настроен с

Головоломки
var bus = Configure.With(new CastleWindsorContainerAdapter(container)) 
      .Logging(x => x.Trace()) 
      .Transport(
       t => t.UseAzureServiceBus(connectionStringNameOrConnectionString: connectionString, 
         inputQueueAddress: ProfileInputQueueName, mode: AzureServiceBusMode.Standard)) 
      .Options(o => o.SimpleRetryStrategy(ProfileErrorQueueName)) 
      .Start(); 

и подписался на тип сообщения, как этот

bus.Subscribe(typeof(Nabufit.Messages.Identity.Events.IdentityCreated)).Wait() 

я ожидал мой обработчик был вызывается автоматически. Однако оно не :(.

Я пробовал различные решения

  • Измененное название входных очередей
  • Создал программу EventEmitter, который опубликовал событие типа «IdentityCreated». При поиске в входной очереди он присутствует, но это не получить подобран ребус

Bonus информация:.

  • Использования лазурного автобус службы
  • хостинга Головоломки внутри приложения Service ткани
  • Моей очереди ввода с именем «Профиль-westeu-входом»
+0

Что происходит? Ничего не происходит вообще? или вы получаете исключение, заявив, что сообщение не может быть отправлено каким-либо обработчикам? – mookid8000

+0

Ничего нет. Последняя информация, которую я получаю от ребуса, заключается в том, что она запустила 1 рабочего, а затем отключилась оттуда. Я вижу, что текущая сборка не обновила пакет WindowsAzure.ServiceBus. Я обновил пакет локально, но, похоже, не исправил проблему. Однако вы бы попытались обновить до последней версии и запустить тест? –

+0

И возглавляет. Мы запускаем .net 4.6.1, у которого есть некоторые проблемы с предлагаемой версией пакета WindowsAzure.ServiceBus в rebus.azureservicebus. http://stackoverflow.com/questions/34329056/azure-webjobs-servicebus-returns-exception-found-2-dns-claims-in-authorization –

ответ

1

После изучения заявки мы обнаружили, что мы разделили наш Виндзорский Container между нашим Webapi в OwinCommunicationListener, у которого была определенная конфигурация зависимостей времени жизни. Это вызвало две разные ошибки.

  1. Ребуса не подобрать события, из-за конфигурации контейнеров
  2. Architectural мудрого это не смарт обмена такой же контейнер с процессом потребляющего

Мы в конечном итоге построением пользовательского ICommunicationListener конкретным для используя процесс сборки с использованием встроенного класса BuiltinHandlerActivation с ребусом. чтобы выглядеть примерно так.

public class ServiceBusCommunicationListener : ICommunicationListener 
{ 
    private BuiltinHandlerActivator activator; 

    public async Task<string> OpenAsync(CancellationToken cancellationToken) 
    { 
     activator = new BuiltinHandlerActivator(); 
     RegisterHandlers(activator); 

     var connectionString = "..."; 
     var bus = Configure.With(activator) 
      .Logging(x => x.Serilog(Log.Logger)) 
      .Transport(
       t => t.UseAzureServiceBus(connectionStringNameOrConnectionString: connectionString, 
         inputQueueAddress: "input", mode: AzureServiceBusMode.Standard)) 
      .Options(o => o.SimpleRetryStrategy("error")) 
      .Start(); 

     return connectionString; 
    } 

    private void RegisterHandlers(BuiltinHandlerActivator builtinHandlerActivator) 
    { 
     (...) 
    } 

    public async Task CloseAsync(CancellationToken cancellationToken) 
    { 
     if (activator != null) 
      activator.Dispose(); 
    } 

    public void Abort() 
    { 
     if (activator != null) 
      activator.Dispose(); 
    } 
} 

И регистрировать ServicebusCommunicationListner как ServiceInstanceListener.

internal sealed class ProfileService : StatelessService 
{ 
    public ProfileService(StatelessServiceContext context) 
     : base(context) 
    { } 

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
    { 
     return new[] 
     { 
      new ServiceInstanceListener(context => new ServiceBusCommunicationListener()), 
     }; 
    } 
} 
+2

Это будет работать, когда сервер Rebus размещен в службе Stateless, но когда Rebus находится в службе Statefull, гораздо лучше настроить и запустить Rebus в метод «Выполнить» службы Statefull. Причина в том, что во время жизненного цикла службы Statefull слушатели связи создаются между выполнением методов Open и Run. Сервисная Fabric не гарантирует, что StateManager в правильном состоянии не будет выполняться, пока не будет запущен метод Run, и поэтому любые обработчики, запускающие и ожидающие работы с StateManager, могут не работать до тех пор, пока не будет запущен метод Run. – mikanyg