邮件处理程序未激活

时间:2016-05-11 13:21:13

标签: azureservicebus azure-service-fabric rebus

我遇到了一些关于rebus的问题。

这是我的情景。 我们有三项服务

身份)发布'IdentityCreated'消息

网关)将'UpdateProfileCommand'直接发送到'profile-westeu-input'队列

个人资料)使用来自输入队列'profile-westeu-input'的消息并订阅'IdentityCreated'消息

个人资料服务

中的rebus配置

鉴于我已经在城堡windsor注册了我的处理程序。

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

我用

配置了Rebus
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'类型的事件。当查看输入队列时,它存在,但它不会被rebus拾取。

奖金信息:

  • 使用azure服务总线
  • 在服务架构应用程序中托管Rebus
  • 我的输入队列名为'profile-westeu-input'

1 个答案:

答案 0 :(得分:1)

在调查应用程序之后,我们发现我们在OwinCommunicationListener中的Webapi之间共享了Windsor Container,它具有一些自定义的依赖关系生命周期配置。这导致了两个不同的错误。

  1. 由于容器配置,Rebus不接收事件
  2. 建筑方面明智的是,它不能与消费过程共享同一个容器
  3. 我们最终使用随rebus提供的内置的BuiltinHandlerActivation类构建了一个特定于总线使用过程的自定义ICommunicationListener。看起来像这样。

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