2014-02-26 42 views
0

我似乎无法得到适用于RabbitMQ上的Mass Transit的Castle Windsor集成。一切都很好,直到我将温莎引入到图片中。我引用了Castle.Windsor 3.2和MassTransit.WindsorIntegration 2.9,并将容器配置为在我的应用程序中使用。我通过注册MassTransit消费者:MassTransit消费者在使用Windsor集成时从未调用

Container.Register(..., Types.FromThisAssembly().BasedOn<IConsumer>()); 

当我调试和这条线跑后检查容器,我可以看到它成功注册所有的消费者与所有我的其他组件一起。然后我有以下代码来初始化和注册服务总线:

var serviceBus = ServiceBusFactory.New(sbc => 
{ 
    sbc.UseRabbitMq(); 
    sbc.ReceiveFrom(Config.ServiceBusEndpoint); 
    sbc.Subscribe(sc => sc.LoadFrom(Container)); 
}); 

Container.Register(Component.For<IServiceBus>().Instance(serviceBus)); 

我使用由MassTransit.WindsorIntegration提供的LoadFrom(IWindsorContainer container)扩展方法。

到目前为止,我发现的所有例子都停在这里,表明这是你应该做的所有事情。不幸的是对我来说,我的消费者永远不会被调用,消息只是堆积在队列中(最终超时并进入错误队列)。消息在消费者队列中显示出来的事实(+我看到一个消费者通过RabbitMQ管理工具绑定到队列中)向我表明消费者可能正在被正确订购 - 所以我不确定问题在于。

我为Windsor和MassTransit添加了NLog日志记录,但日志中没有显示错误。我不确定在这一点上我应该如何进行故障排除。有任何想法吗?

此外,此应用程序目前只是使用Topshelf进行开发的控制台应用程序。最终它将作为Windows服务安装。不知道这是否相关,但我想我会提及它以防万一。

UPDATE

作为测试我创建了一个非常简单的消费者与用于处理非常简单的测试消息中的参数的构造函数。此消费者已成功呼叫!然而,“真正的”消费者具有需要通过构造函数注入到它们中的依赖关系。我希望Container能够解决这些问题,但显然它存在一些麻烦。奇怪的是,在日志中没有任何东西显示它。敬请期待...

回答

1

好吧我想通了。在我添加/删除NuGet软件包的过程中,我以某种方式设法删除了对我的某个组件(RedisClientsManager)所需的DLL(ServiceStack.Text.dll)的引用。

我开始调试,让我所有的组件获得注册,然后弹出立即窗口打开并试图逐一解决每个组件(通过调用container.Resolve < RegisteredType>()),直到我发现了一个当我试图解决它时抛出异常。

温莎在那一点的异常消息告诉了我到底是什么问题。我为什么没有被记录,或者为什么在容器本身试图解决它时没有引发异常,我有点失落。无论如何,故事的寓意是确保您的组件得到解决。