消息保证
消息自主性
在进行JMS开发的时候,应该想到,消息只有在客户端的业务逻辑处理完毕后,才会发出。
AUTO_ACKNOWLEDGE,如果是持久化消息,服务器收到消息后,进行持久化保存,然后自动告诉客户端消息已经收到。订阅模式,如果是长期的订阅者,
非持久化的消息,收到后就自动确定了。如果主题没有订阅者,那么该消息会被抛弃。
消息从
服务端通知给接收端后,接收端收到,告诉服务端已经收到,如果是
队列,那么该消息会被清理出持久层,订阅模式,则是当所有的订阅者都收到,然后清理持久层。
DUPS_OK_ACKNOWLEDGE
该确认模式通知会话延迟确认消息的传递。一些失败,这可能会导致一些重复消息的传送,所以,该模式应当仅用于可以允许重复消息的
消费者。该模式的使用能够通过会话将防止重复消息的工作减至最少来降低会话系统开销。
CLIENT_ACKNOWLEDGE
客户端主动确定,通过message.acknowledge();方法回应。客户端可能逐个的确认它所消费的每条消息,或可以选择确认应用定义的一组消息(通过调用组中最后接收到的消息的 acknowledge 方法,这样就确认该会话消费的所有消息。)。
已经收到的但没有确认的消息可能会被重新传送。
判断是否重新发送的消息
if (message.getJMSRedelivered()) {
processCompensatingTransaction();
}
消息组
假设发送者发送了三个消息出去
//send an empty payload message starting the group
BytesMessage msg = session.createBytesMessage();
msg.setStringProperty("SequenceMarker", "START_SEQUENCE");
sender.send(msg);
//now send the messages
TextMessage msg = session.createTextMessage(messagePayload);
sender.send(msg);
...
//send an empty payload message ending the group
BytesMessage msg = session.createBytesMessage();
msg.setStringProperty("SequenceMarker", "END_SEQUENCE");
sender.send(msg);
消费者会不断的收到消息,但是会判断该消息是不是最后一个
if (marker.equals("END_SEQUENCE")) {
//process the message
System.out.println("Messages: ");
for (String msg : messageBuffer) {
System.out.println(msg);
}
//acknowledge that all messages have been received
message.acknowledge();
}
来决定
要不要调用message.acknowledge();