0

我似乎无法通过 RabbitMQ 让 Castle Windsor Integration 为 Mass Transit 工作。在我将温莎引入图片之前,一切都很好。我引用了 Castle.Windsor 3.2 和 MassTransit.WindsorIntegration 2.9 并配置了容器以在我的应用程序中使用。我正在通过以下方式注册 MassTransit 消费者:

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));

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

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

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

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

更新

作为一个测试,我创建了一个非常简单的消费者,它带有一个无参数的构造函数来处理一个非常简单的测试消息。这个消费者被成功调用!然而,“真正的”消费者具有需要通过构造函数注入它们的依赖项。我希望 Container 能解决这些问题,但显然它遇到了一些麻烦。奇怪的是,日志中没有显示任何关于它的内容。敬请关注...

4

1 回答 1

1

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

我启动了调试器,让我的所有组件都被注册,然后弹出打开即时窗口并尝试一个一个地解析每个组件(通过调用 container.Resolve< RegisteredType >()),直到我找到在我尝试时抛出异常的那个解决它。

那时来自温莎的异常消息告诉我问题出在哪里。对于为什么没有记录这个问题或者为什么在容器本身试图解决它时没有引发异常,我有点迷茫。无论如何,故事的寓意是确保您的组件解决。

于 2014-02-26T23:03:03.780 回答