我正在尝试为我正在编写的一对 Windows 服务设置 RabbitMQ,以便以快速可靠的方式促进它们之间的通信。但是,我在尝试设置主要的 Windows 服务引擎时遇到了问题,这些引擎需要建立到 RabbitMQ 服务器的连接才能完成它们的工作。
基本上,RabbitMQ 的 .NET 客户端中的 ConnectionFactory
对象不是抽象的,也没有实现任何接口(interface)。我看不到使用像 StructureMap 这样的 IoC 容器注入(inject)此类的明显方法。甚至文档中的代码示例也只是公然地新建
,如下所示:
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection conn = factory.CreateConnection();
出现在我面前的解决方案是将整个工厂插入服务的主要 OnStart
和 OnStop
功能,这真的很难测试而且不是很大无论如何兴趣。但是,这给我留下了一个用于该服务的 IConnection
,因此如果该连接以任何方式中断,该服务将无法恢复,必须简单地退出。如果主机对工厂有可见性,它可以简单地产生一个新的连接并继续。但是除非我注入(inject)它,否则在不连接到现有服务器的情况下无法测试主引擎!
我在这里遗漏了什么吗?我没有考虑的任何其他选择?我该如何着手注入(inject)这个工厂,如果不能,我该如何限制损失?
编辑:另外,作为事后的想法,我非常乐意对 RabbitMQ 的 .NET 客户端进行更改以在其上实现一个接口(interface),如果有人很好地了解主要开发团队对这样的更改的接受程度这个。我很乐意做出贡献,但我最不想做的就是让我的程序在某些自定义版本的 RabbitMQ 上运行,从而首先消除使用第三方库的主要好处。
最佳答案
RabbitMQ C# 客户端是一个低级的纯 AMQP 实现,您可能希望将其包装在一些更高级别的抽象中,然后将其注册到您的 IoC 容器中。
EasyNetQ ,对基本客户端的更高级别的抽象,实现了一个持久的 AMQP 连接,该连接在连接丢失后重新连接(通过网络问题或服务器弹跳),并重建所有当前订阅。欢迎您使用您认为有用的任何代码。
简而言之,这是一个将连接管理包装在某种 PersistentConnection 中的问题。类,然后注册每个订阅 with some code to rebuild them after a successful reconnect .
我写了a blog post关于连接 EasyNetQ、Windsor IoC 容器和 TopShelf。我已成功使用此技术构建基于 RabbitMQ 的 Windows 服务。
关于c# - RabbitMQ:注入(inject)连接工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181328/