ActiveMQ 未找到连接的 IConnectionFactory 实现
Posted
技术标签:
【中文标题】ActiveMQ 未找到连接的 IConnectionFactory 实现【英文标题】:ActiveMQ No IConnectionFactory implementation found for connection 【发布时间】:2016-03-30 01:41:03 【问题描述】:我在服务器上安装了 ActiveMQ 5.13.0 Release 并尝试使用 C# 客户端访问代理。我创建了一个控制台应用程序并安装了 Apache.NMS.ActiveMQ 版本 1.7.1 nuget 包。当我尝试访问代理时:
Line 1 Uri uri = new Uri("tcp://192.168.110.136:61616");
Line 2 NMSConnectionFactory NMSFactory = new NMSConnectionFactory(uri);
在第二行它抛出 No IConnectionFactory implementation found for connection URI: tcp://192.168.110.136:61616/ 异常。
Project 的 .NET Framework 版本是 3.5,我也尝试使用 .NET 4.0 和 4.5。但结果是一样的,抛出同样的异常。
ActiveMQ 正在服务器上运行,我可以通过 telnet 和管理 UI 访问服务器的 61616 端口。我检查了其他类似的帖子,但没有帮助解决问题。欢迎任何帮助。
谢谢。
【问题讨论】:
当我使用 ConnectionFactory NMSFactory = new ConnectionFactory(uri);而不是 NMSConnectionFactory 它可以工作。如果有人知道有什么区别,请解释一下。谢谢。 【参考方案1】:如果有人知道这两者有什么区别,请解释一下。
在我的项目中,我使用了一个非常旧的版本 (1.1) 的 Apache.NMS.ActiveMQ,它带有一个名为 nmsprovider-activemq.config 的文件。
升级时,我遇到了与您观察到的相同类型的问题。
我发现 NMSConnectionFactory 与早期版本不同。
-
较新的版本有一个预配置工厂 URL 的查找列表(用于定位正确的程序集和工厂实现)
程序集的名称可以被我提到的配置文件覆盖。但是,如果旧版本需要配置文件来提供程序集的全名(包括 .dll 文件扩展名),新版本的 NMSConnectionFactory 会调用 Assembly.Load(),在这种情况下会失败。
简单地自己加载 ActiveMQ 程序集并实例化它的工厂并不那么复杂,但我想在不同工厂之间切换会变得更加繁琐。但是,实际结果(如果您只关心一种类型的工厂)是相同的。 NMSFactory 的主要任务是定位所选提供者的工厂类。
升级此程序集的最后一个缺陷是现在需要在连接对象上调用 .Start()。
TL;DR:检查你是否有我提到的配置文件。编辑它(去掉 .dll 文件扩展名)或完全删除它(它可能不包含任何尚未硬编码到 Apache.NMS 程序集中的信息)
【讨论】:
【参考方案2】:首先,确保您的应用程序同时引用 Apache.NMS.dll 和 Apache.NMS.ActiveMQ.dll 程序集,以便能够访问所有实现位。
然后尝试通过通用 NMSConnectionFactory 使用引用您尝试使用的提供程序实现的 URI:
Uri uri = new Uri("activemq:tcp://192.168.110.136:61616");
您可以选择直接使用 ActiveMQ IConnectionFactory 实现:
IConnectionFactory factory = new Apache.NMS.ActiveMQ.ConnectionFactory(uri);
【讨论】:
不引用 Apache.NMS.ActiveMQ.dll 是我的问题。谢谢!以上是关于ActiveMQ 未找到连接的 IConnectionFactory 实现的主要内容,如果未能解决你的问题,请参考以下文章
activeMQ学习---------点对点发布订阅的消息代码实现
ActiveMQ JMS XA Atomikos - 事务未启动错误