本篇主要介紹JMS的消息確認(rèn)機(jī)制癞志。
JMS 消息只有在被確認(rèn)之后锣笨,才認(rèn)為已經(jīng)被成功地消費(fèi)了。消息的成功消費(fèi)通常包含三個(gè)階段:客戶接收消息菲驴、客戶處理消息和消息被確認(rèn)荐吵。
對于事務(wù)性會(huì)話,當(dāng)事務(wù)提交時(shí),確認(rèn)工作自動(dòng)發(fā)生先煎;在非事務(wù)會(huì)話中贼涩,消息的確認(rèn)機(jī)制在會(huì)話創(chuàng)建時(shí)就應(yīng)該指定,JMS中定義了三種確認(rèn)方式:
1.Auto_ACKnowledge,自動(dòng)確認(rèn)模式薯蝎,對于同步消費(fèi)消息的遥倦,在成功調(diào)用過receive()方法之后,且無異常發(fā)生時(shí)良风,會(huì)話將自動(dòng)對收到消息予以確認(rèn)谊迄;對于異步消費(fèi)消息的,在onMessage()方法成功調(diào)用后烟央,且無異常發(fā)生時(shí)统诺,會(huì)話即對收到的消息予以確認(rèn)。
2.Client_ACKnowledge, 客戶端自行確認(rèn)模式疑俭,這種模式需要消息消費(fèi)者顯式的調(diào)用Message類的acknowledge()方法予以確認(rèn)粮呢。
3.Dups_ACKnowledge,延時(shí)或批量通知模式,這種模式允許消息消費(fèi)者不必急于確認(rèn)收到的消息钞艇,允許在收到多個(gè)消息之后一次完成確認(rèn)啄寡;這種方式有時(shí)可能更有效,因?yàn)樵谙⑻峁┱弑罎⒌臅r(shí)候哩照,如果消息沒有確認(rèn)挺物,消息可以重新發(fā)送。
通過Connection創(chuàng)建Session時(shí)飘弧,如果指定為非事務(wù)性會(huì)話時(shí)识藤,必須指定確認(rèn)模式
Session session=connection.createSession(false,Session.Auto_ACKnowledge)//這里必須指定一個(gè)確認(rèn)模式