第27章 事前承認モード

JMS は、次の 3 つの承認モードを指定します。
  • AUTO_ACKNOWLEDGE
  • CLIENT_ACKNOWLEDGE
  • DUPS_OK_ACKNOWLEDGE
ただし、JMS によってサポートされない別のケースがあります。場合によっては、障害発生時にメッセージを失い、メッセージをクライアントに配信する前にサーバーでメッセージを承認することが適切なことがあります。
HornetQ では、この特別なモードは pre-acknowledge モードと呼ばれます。
配信前にサーバーで承認する欠点は、サーバーでメッセージを承認してからメッセージがクライアントに配信されるまでにシステムがクラッシュした場合に、メッセージが失われることです。
メッセージングのケースに応じて、事前承認モードでは、メッセージが失われることがある代わりにネットワークトラフィックと CPU の負荷を回避できます。
事前承認の使用例は、株価更新メッセージです。これらのメッセージでは、クラッシュ時にメッセージを失うことが適切な場合があります。これは、次の株価更新メッセージがすぐに到着し、前の株価を上書きするためです。

注記

事前承認モードを使用する場合は、消費されるメッセージのトランザクションセマンティクスが失われます。これは、メッセージが、トランザクションをコミットしたときではなく、サーバーで最初に承認されるためです。

27.1. PRE_ACKNOWLEDGE の使用

これは、以下のように JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-jms.xml ファイルの connection factory で設定できます。
<connection-factory name="NettyConnectionFactory">
   <connectors>
      <connector-ref connector-name="netty-connector"/>
   </connectors>
   <entries>
      <entry name="/ConnectionFactory"/>
   </entries>
   <pre-acknowledge>true</pre-acknowledge>
</connection-factory>
または、JMS API で事前承認モードを使用するために、HornetQSession.PRE_ACKNOWLEDGE 定数で JMS セッションを作成します。
// messages will be acknowledge on the server *before* being delivered to the client
Session session = connection.createSession(false, HornetQSession.PRE_ACKNOWLEDGE);
または、セッターメソッドを使用して、HornetQConnectionFactory インストールで直接事前承認を設定できます。
コア API で事前承認を使用するために、セッターメソッドを使用して ClientSessionFactory インスタンスで直接これを設定できます。