You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ActiveMQ.Artemis.Client从.NET应用订阅ActiveMQ Artemis队列遇连接超时问题

问题描述

我正尝试用ActiveMQ.Artemis.Client从.NET应用拉取远程ActiveMQ Artemis服务器上某多播类型持久化队列的消息。本地运行.NET测试代码时,有时能正常拉取,但多数时候会永久卡在await connectionFactory.CreateAsync()这一行。

队列中确实存在消息,查看ActiveMQ Artemis的journalctrl日志,发现连接超时错误:

ERROR [org.apache.activemq.artemis.core.server] AMQ224088: Timeout (10 seconds) on acceptor "ssl-acceptor" during protocol handshake with /[local ip]:55454 has occurred.

ActiveMQ Artemis服务端无其他异常,且我用Python的stomp库可以稳定订阅该地址的队列。

测试代码如下:

using ActiveMQ.Artemis.Client;

var connectionFactory = new ActiveMQ.Artemis.Client.ConnectionFactory();
var endpoint = Endpoint.Create(host: "this.systems", port: "port", user: "user", password: "password", scheme: Scheme.Amqps);

// 卡在这一行
var connection = await connectionFactory.CreateAsync(endpoint);

var consumer = await connection.CreateConsumerAsync(new ConsumerConfiguration() { Address = "test2.address", Queue = "test2.queue" });

var message = await consumer.ReceiveAsync();
var body = message.GetBody<string>();
System.Console.WriteLine(body);

await connection.DisposeAsync();
排查与解决建议

1. 延长服务器端SSL握手超时

服务器默认SSL握手超时为10秒,.NET客户端的SSL握手流程可能因网络延迟、本地配置等原因超时。修改ActiveMQ Artemis的broker.xml中ssl-acceptor的handshake-timeout参数,延长超时时间:

<acceptor name="ssl-acceptor">tcp://0.0.0.0:61617?sslEnabled=true;keyStorePath=../etc/broker.ks;keyStorePassword=password;handshake-timeout=30000</acceptor>

将handshake-timeout设为30000(30秒),重启服务后测试。

2. 显式配置客户端SSL参数

ActiveMQ.Artemis.Client默认SSL配置可能与服务器端不兼容,手动指定SSL协议及验证策略:

var sslOptions = new SslOptions
{
    // 仅测试环境跳过证书验证,生产环境需配置信任根证书
    ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true,
    EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13
};

var endpoint = Endpoint.Create(
    host: "this.systems", 
    port: "port", 
    user: "user", 
    password: "password", 
    scheme: Scheme.Amqps,
    sslOptions: sslOptions);

3. 调整客户端连接超时

客户端默认连接超时可能过短,创建ConnectionFactory时显式设置更长超时:

var connectionFactory = new ConnectionFactory
{
    ConnectTimeout = TimeSpan.FromSeconds(30)
};

4. 验证AMQPS端口的网络连通性

虽然STOMP协议能正常连接,但AMQPS使用的端口/协议与STOMP不同,需确认本地到服务器的AMQPS端口未被防火墙拦截、网络路由稳定。可通过以下命令测试端口连通性:

nc -zv this.systems port

5. 升级客户端版本

旧版本的ActiveMQ.Artemis.Client可能存在AMQP握手bug,通过NuGet包管理器升级到最新稳定版后再测试。

内容的提问来源于stack exchange,提问作者BenW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:06:10