提问人:MaciejT 提问时间:10/14/2023 最后编辑:MaciejT 更新时间:10/26/2023 访问量:163
尝试在 .NET Core 控制台应用程序中通过 NMS 与 ActiveMQ 建立连接时出现异常
I get an exception while trying to establish connection to ActiveMQ via NMS in .NET Core console application
问:
我正在尝试创建简单的概念证明控制台应用程序,该应用程序向队列生成 XML 文件消息,然后使用该队列中的消息。问题是我无法通过 .CreateConnection() 方法。当我尝试这样做时,我得到这个异常:
Unhandled exception. Apache.NMS.NMSConnectionException: Error creating transport.
---> System.Exception: NewInstance failed to find a match for id = tcp
at Apache.NMS.ActiveMQ.Transport.TransportFactory.NewInstance(String scheme)
at Apache.NMS.ActiveMQ.Transport.TransportFactory.CreateTransportFactory(Uri location)
--- End of inner exception stack trace ---
at Apache.NMS.ActiveMQ.Transport.TransportFactory.CreateTransportFactory(Uri location)
at Apache.NMS.ActiveMQ.Transport.TransportFactory.CreateTransport(Uri location)
at Apache.NMS.ActiveMQ.ConnectionFactory.CreateActiveMQConnection(String userName, String password)
at Apache.NMS.ActiveMQ.ConnectionFactory.CreateActiveMQConnection()
at Apache.NMS.ActiveMQ.ConnectionFactory.CreateConnection()
at ArtemisSender.Program.Main(String[] args) in C:\Users\####\Program.cs:line 12
这是我的程序.cs文件:
using Apache.NMS;
using Apache.NMS.ActiveMQ;
namespace ArtemisSender
{
class Program
{
static void Main(string[] args)
{
IConnectionFactory factory = new ConnectionFactory(new Uri("activemq:tcp://0.0.0.0:61616"));
using (IConnection connection = factory.CreateConnection())
{
connection.Start();
using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
{
IDestination destination = session.GetQueue("queueAddress:newQueue");
using (IMessageProducer producer = session.CreateProducer(destination))
{
ITextMessage textMessage = producer.CreateTextMessage("This is a test message.");
producer.Send(textMessage);
Console.WriteLine("Message sent");
}
}
}
}
}
}
这是我的 transportConnectors 来自 activemq.xml 文件
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
我尝试使用不同的协议,例如踩踏,但这并没有真正帮助。我尝试禁用防火墙和防病毒软件,希望这也许会有所帮助,但没有。
我已经浏览了文档和源代码以了解“无法找到id = tcp的匹配项”消息,但我没有找到任何内容。
我正在使用: -.NET 7.0 -Apache.NMS v.2.1.0 -Apache.NMS.ActiveMQ v.2.1.0
Artemis 版本为 2.31.0
找到解决方案
该错误仅在 Apache.NMS 的 2.1.0 版本上发生。迁移到 2.0.0 版本已解决的问题
答:
使用 NMS API 工厂时,您需要指定要使用的协议库,在您的情况下,该协议库将是“activemq”,因此您的 URI 如下所示NMSConnectionFactory
activemq:tcp://localhost:61616
并且您必须具有对 NMS 的引用。ActiveMQ 库,以便 NMSConnectionFactory 可以找到它。NMS API 本身不是协议实现,您需要同时获取要使用的协议的 API 和客户端库。
当使用协议库实现本身时,不使用 那么你不需要像上面那样在 URI 中使用协议名称,而应该使用标准形式,例如ConnectionFactory
NMSConnectionFactory
tcp://localhost:61616
应该注意的是,我认为没有人在积极测试或检查 NMS 客户端库是否在最新的 .NET 版本上运行。
评论
找到解决方案
该错误仅在 Apache.NMS 的 2.1.0 版本上发生。迁移到 2.0.0 版本已解决的问题
评论