确认是指客户端与消息服务之间为确保可靠消息传送而发送的消息。对于生成方和使用方,确认的用途是不同的。
如果是生成消息,则代理将确认收到消息、将消息传送到其目的地并将其持久存储。生成方的 send() 方法会被阻止,直至它收到此确认为止。这些确认对于持久性消息要发送到的客户端是透明的。
使用消息时,客户端确认已收到从某个目的地传送来的消息并已使用它,然后代理从该目的地中删除该消息。JMS 指定不同的确认模式代表不同的可靠度。
在 AUTO_ACKNOWLEDGE 模式下,会话自动确认客户端使用的每条消息。会话线程会被阻止,以等待代理确认它已处理了每个已使用消息的客户端确认。
在 CLIENT_ACKNOWLEDGE 模式下,在一条或多条消息被使用后,客户端通过调用消息对象的 acknowledge() 方法来显式确认。这样该会话就确认了自上次调用该方法后使用的所有消息。会话线程会被阻止,以等待代理确认它已处理了客户端确认。
Message Queue 提供使客户端可仅仅确认收到一条消息的方法,从而扩展了该模式。
在 DUPS_OK_ACKNOWLEDGE 模式下,会话在使用了十条消息后进行确认。会话线程不会因等待代理确认而被阻止,因为在该模式下代理确认不是必需的。虽然该模式可保证不会丢失消息,但并不能保证不会收到重复的消息,因此名称为:DUPS_OK。
对于更关心性能而不是可靠性的客户端, Message Queue 服务通过提供 NO_ACKNOWLEDGE 模式来扩展 JMS API。在该模式下,代理不跟踪客户端确认,所以不保证使用方客户端已成功处理了消息。对于发送至非长期订户的非持久性消息,选择该模式可提高性能。