如何使用 Stomp 取消确认消息

 常见问题解答 > 使用 Apache ActiveMQ Classic > 如何使用 Stomp 取消确认消息

Stomp 中没有明确的“取消确认”命令。客户端收到消息后,无法将其标记为“未消费”并发送给另一个订阅者(或重新发送给同一订阅者)。您的应用程序(或 Stomp 客户端)负责处理接收消息的失败处理并实现“消息重新发送”。

Stomp 事务通常被错误地认为是解决此用例的方案。但事实并非如此,因为事务仅与发送消息和确认相关。如果您启动一个事务,在事务中发送消息确认,最后中止它,则消息将不会再次重新发送。这仅仅意味着如果达到预取限制,代理将不再向客户端发送任何消息。

请查看以下示例

StompConnection connection = new StompConnection();
connection.open("localhost", 61613);
		
connection.connect("system", "manager");
		
connection.send("/queue/test", "message 1");
connection.send("/queue/test", "message 2");
connection.send("/queue/test", "message 3");
		
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("activemq.prefetchSize", "1");
connection.subscribe("/queue/test", "client", headers);
		
connection.begin("tx1");
StompFrame frame = connection.receive();
System.out.println(frame.getBody());
connection.ack(frame, "tx1");
connection.abort("tx1");
		
connection.begin("tx2");
connection.ack(frame, "tx2");        //sending the ack again
frame = connection.receive();
System.out.println(frame.getBody());
connection.ack(frame, "tx2");
connection.commit("tx2");
		
connection.begin("tx3");
frame = connection.receive();
System.out.println(frame.getBody());
connection.ack(frame, "tx3");
connection.commit("tx3");

此简单应用程序将打印

message 1
message 2
message 3

由于事务 tx1 已被中止,我们需要在 tx2 中再次确认该消息,以便能够接收下一条消息(因为使用的预取大小为 1)。

请参阅以下页面以获取更多信息

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。