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消息队列的Spring整合配置

activeMQ学习---------点对点发布订阅的消息代码实现

ActiveMQ JMS XA Atomikos - 事务未启动错误

从activemq连接工厂创建连接时Activemq在启动时失败

activemq连接过多导致变慢

ActiveMq:超过允许的最大客户端连接数