创建session时,确认模式会在AMQ上设置
tSession=tConnect.createXXXTopicSession(false,Session.AUTO_ACNOWLEDGE)
tSession=tConnect.createXXXTopicSession(false,Session.DUPS_OK_AUTO_ACNOWLEDGE)
tSession=tConnect.createXXXTopicSession(false,Session.CLIENT_AUTO_ACNOWLEDGE)
下面分别介绍三种确认模式:
这种模式可以从三种角度来看,我们知道JMS消息传送的结构分为生产者(P)、服务器(s)和消费者(c)
对于P来说无论是主题的publish方法还是队列的send方法执行了之后线程就会阻塞等待下一条确认消息,如果确认消息成功返回就说明执行成功,否者抛出异常。
对于S来说分两种情况:
S-àP 服务器对生产者的确认消息根据消息类型和订阅者的方式不同而不同:
☆对于持久消息,首先S将消息存入持久存储器然后给P发送确认消息,持久消息将等待有消费者来将其消费,非持久消息存在内存中,S直接将确认消息返回,队列上的消息将在消息生存期到达之后自动消失。
☆持久订阅消费者如果存在的话并且没有建立连接,则S也会将消息存入持久存储器在持久订阅者下次连接取得消息并返回确认时自动从持久存储器中消除。
C-àS 消费者接到消息之后向S返回确认消息,使S对消息进行处理(从内存或存储器删除)如果在传送确认消息的过程中出现故障则服务器就会再次传送,这种情况违背了“一次而且仅仅一次”的要求,再次传送时消息的redelivered属性标记为true,C可以根据消息的getJMSRedelivered方法来判断要不要接收该消息。再次传送肯定要比完全丢失要好。
2. DUPS_OK_ACNOWLEDGE
可以将一条消息向同一个目的地发送两次以上消息,传说比AUTO_ACNOWLEDGE再次发送的效率要高,性能好,其实不一定。
AUTO_ACNOWLEDGE确认消息是在onMessage()之后发生而使用Message的CLIENT_ ACNOWLEDGE 特有的acknowledge()方法可以在onMessage()的任何地方返回确认,控制何时发送确认也可以一次发送多个消息的确认,称为“编组多条消息”。
备注:这三种消息确认模式在我的那本Java消息服务书上都有(P127)想看的可以找我借,有些地方可能解释的也不一定对仅供参考。
联系客服