使用嵌入式ActiveMQ Artemis配置STOMP端点遇连接超时求助
问题描述
我正尝试在Java中使用嵌入式ActiveMQ Artemis配置STOMP端点。服务器已启动并能接收我的Dart客户端连接,但随后连接超时,该循环无限重复。
服务器代码
EmbeddedActiveMQ server = new EmbeddedActiveMQ(); org.apache.activemq.artemis.core.config.Configuration config = new org.apache.activemq.artemis.core.config.impl.ConfigurationImpl(); config.addAcceptorConfiguration("in-vm", "vm://0"); config.addAcceptorConfiguration("stomp", "tcp://0.0.0.0:61616?protocols=stomp"); config.setSecurityEnabled(false); config.setPersistenceEnabled(false); server.setConfiguration(config); server.start()
超时日志
[Thread-0 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@2b82c43a)] WARN org.apache.activemq.artemis.core.client [] - AMQ212037: Connection failure to /192.168.1.164:46478 has been detected: AMQ229014: Did not receive data from /192.168.1.164:46478 within the 60,000ms connection TTL. The connection will now be closed. [code=CONNECTION_TIMEDOUT]
配置遗漏排查及解决办法
检查STOMP协议版本兼容性:Dart STOMP客户端使用的协议版本可能与Artemis默认支持的版本不匹配。可在acceptor配置中显式指定支持的STOMP版本,修改后的acceptor URL如下:
tcp://0.0.0.0:61616?protocols=stomp&stompVersions=1.2,1.1,1.0调整连接超时与心跳参数:默认60秒的连接TTL可能导致未及时检测到客户端状态,可修改服务器配置调整相关参数:
config.setConnectionTTL(30000); // 将连接超时设置为30秒 config.setClientFailureCheckPeriod(10000); // 每10秒检查一次客户端连接状态同时确保Dart客户端配置了心跳机制,设置
heartbeatIncoming和heartbeatOutgoing参数,维持与服务器的心跳交互,避免因无数据传输触发超时。验证客户端握手流程:服务器检测到连接但未收到数据,大概率是客户端未完成STOMP协议的握手。检查Dart客户端代码是否正确发送了包含
accept-version等必要参数的CONNECT帧,确保协议握手完整。排查网络传输问题:确认客户端与服务器之间的网络无丢包,防火墙或安全组未拦截STOMP帧的后续传输,保证数据能正常双向流通。
内容的提问来源于stack exchange,提问作者Johnson

