如何使用 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)。
请参阅以下页面以获取更多信息