尝试在 .NET Core 控制台应用程序中通过 NMS 与 ActiveMQ 建立连接时出现异常

I get an exception while trying to establish connection to ActiveMQ via NMS in .NET Core console application

提问人:MaciejT 提问时间:10/14/2023 最后编辑:MaciejT 更新时间:10/26/2023 访问量:163

问:

我正在尝试创建简单的概念证明控制台应用程序,该应用程序向队列生成 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&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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 版本已解决的问题

C# .NET 控制台 应用程序 ActiveMQ

评论

0赞 Tim Bish 10/14/2023
请添加更多调试详细信息以及您正在使用的所有库的版本,我们需要详细信息来提供帮助,而您尚未向我们提供任何详细信息
0赞 MaciejT 10/14/2023
我已经更新了帖子。告诉我是否还有什么可以补充的

答:

0赞 Tim Bish 10/14/2023 #1

使用 NMS API 工厂时,您需要指定要使用的协议库,在您的情况下,该协议库将是“activemq”,因此您的 URI 如下所示NMSConnectionFactory

activemq:tcp://localhost:61616

并且您必须具有对 NMS 的引用。ActiveMQ 库,以便 NMSConnectionFactory 可以找到它。NMS API 本身不是协议实现,您需要同时获取要使用的协议的 API 和客户端库。

当使用协议库实现本身时,不使用 那么你不需要像上面那样在 URI 中使用协议名称,而应该使用标准形式,例如ConnectionFactoryNMSConnectionFactory

 tcp://localhost:61616

应该注意的是,我认为没有人在积极测试或检查 NMS 客户端库是否在最新的 .NET 版本上运行。

评论

0赞 MaciejT 10/14/2023
我正在这样做,但它也没有帮助。仍然有同样的例外。现在我试着改用阿尔忒弥斯。那么 uri 应该看起来像这样:“artemis:tcp://0.0.0.0:61616”还是应该相同?
0赞 Tim Bish 10/14/2023
不,没有 NMS。Core协议的Artemis库,您仍需要使用ActiveMQ或AMQP库
1赞 MaciejT 10/26/2023 #2

找到解决方案

该错误仅在 Apache.NMS 的 2.1.0 版本上发生。迁移到 2.0.0 版本已解决的问题