ActiveMQ Classic 5.16.2 STOMP订阅MESSAGE帧无ack头原因排查
STOMP订阅ActiveMQ主题无ACK头问题排查与解决
核心问题
ActiveMQ Classic 5.16.2默认对普通主题订阅(非持久化)忽略ack:client配置,不会在MESSAGE帧里携带ack头——因为Broker默认把主题订阅的消息传递模式锁死为自动确认,哪怕手动指定了手动确认也不会生效。
解决办法分两种情况:
1. 改用持久化主题订阅
只有持久化的主题订阅,Broker才会给MESSAGE帧添加ack头以支持手动确认。订阅时需要同时传递几个关键参数:
id: 唯一的订阅标识client-id: 客户端唯一IDpersistent:true: 标记为持久化订阅
示例SUBSCRIBE帧:
SUBSCRIBE destination:/topic/your_target_topic ack:client id:my_unique_sub_id client-id:stomp_client_001 persistent:true ^@
2. 修改Broker配置开启普通主题手动确认
如果不想使用持久化订阅,需要修改activemq.xml中的STOMP连接器配置,添加allowTopicSubscriptionsWithAckClient="true"参数:
<transportConnectors> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?allowTopicSubscriptionsWithAckClient=true"/> </transportConnectors>
修改完成后重启Broker,之后普通主题订阅设置ack:client时,MESSAGE帧就会携带ack头了。
验证方式
订阅成功后,收到的MESSAGE帧应该会包含类似如下的ack字段:
MESSAGE destination:/topic/your_target_topic ack:my_unique_sub_id:123456 message-id:ID:your_broker_id-1699999999999-1:1:1:1:1 your message content ^@
这时就可以用ACK帧手动确认:
ACK id:my_unique_sub_id:123456 ^@
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

