ページの先頭行へ戻る
Interstage Application Server Java EE運用ガイド(Java EE 6編)
Interstage

3.12.6 事前配信

メッセージブローカは、事前配信機能を使用してコンシューマにメッセージを配信します。
事前配信機能を使用することにより、コンシューマの受信処理は、メッセージブローカとの通信が不要となるため、通信のオーバーヘッドが軽減されます。

以下に事前配信処理を説明します。


単一コンシューマの事前配信処理

物理格納先から1つのコンシューマに事前配信される処理概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。


[処理の流れ]

(1) コネクション開始

コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。

(2) 事前配信

物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。

上記の図の場合、メッセージブローカは、メッセージ3件(A,B,C)を事前配信します。

(3) 受信要求

コンシューマがメッセージの受信要求を行うと、事前配信されたメッセージが格納されている一時格納域に対してメッセージの配信を要求します。

(4) 配信

コンシューマは、メッセージ(A)を受信します。


複数コンシューマの事前配信処理(蓄積メッセージあり)

メッセージが蓄積されている物理格納先から複数のコンシューマに事前配信される処理概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。

[処理の流れ]

(1) JMSクライアント3がメッセージ送信

プロデューサが物理格納先にメッセージを5件(A,B,C,D,E)送信します。

(2) JMSクライアント1がコネクション開始

コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。

(3) JMSクライアント1に事前配信

物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。
上記の図の場合、メッセージブローカは、メッセージ3件(A,B,C)を配信します。

(4) JMSクライアント2がコネクション開始

コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。

(5) JMSクライアント2に事前配信

物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。
上記の図の場合、メッセージブローカはメッセージ2件(D,E)を配信します。

(6) JMSクライアント1が受信要求

コンシューマは、メッセージ(A,B,C)の順番に受信します。
メッセージ(D,E)は、JMSクライアント2に事前配信済であるため、受信できません。

(7) JMSクライアント2が受信要求

コンシューマは、メッセージ(D,E)の順番に受信します。
メッセージ(A,B,C)は、JMSクライアント1に事前配信済であるため、受信できません。


複数コンシューマの事前配信処理(蓄積メッセージなし)

メッセージが蓄積されていない物理格納先から複数のコンシューマに事前配信される概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。

[処理の流れ]

(1) JMSクライアント1がコネクション開始

コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
しかし、物理格納先にメッセージが蓄積されていないため、事前配信が実施されません。

(2) JMSクライアント2がコネクション開始

コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
しかし、物理格納先にメッセージが蓄積されていないため、事前配信が実施されません。

(3) JMSクライアント3がメッセージ送信

プロデューサが物理格納先にメッセージを5件(A,B,C,D,E)送信します。

(4) JMSクライアント1および2に事前配信

メッセージブローカは、物理格納先に設定されたconsumerFlowLimitを上限として、物理格納先に蓄積されたメッセージをランダムに振り分けます。
上記の図の場合は、以下を行います。

  1. JMSクライアント1にメッセージ3件(A,C,D)を事前配信します。

  2. JMSクライアント2にメッセージ2件(B,E)を事前配信します。

(5) JMSクライアント1が受信要求

コンシューマは、メッセージ(A,C,D)の順番に受信します。
メッセージ(B,E)は、JMSクライアント2に事前配信済であるため、受信できません。

(6) JMSクライアント2が受信要求

コンシューマは、メッセージ(B,E)の順番に受信します。

メッセージ(A,C,D)は、JMSクライアント1に事前配信済であるため、受信できません。


consumerFlowLimitの設定

コンシューマに事前配信するメッセージの数は、物理格納先の作成時に、consumerFlowLimitプロパティを設定することで変更できます。

物理格納先の作成は、imqcmdコマンドのcreate dstサブコマンドを使用して行います。詳細については、「9.5.1 create dstサブコマンド」を参照してください。

プロパティ

構成情報

設定値

省略値

コマンドでの設定
(値の範囲)

consumerFlowLimit

物理格納先にメッセージが蓄積されている場合、本プロパティで設定したメッセージ数を一単位としてメッセージの受信処理を行うコンシューマに、蓄積されたメッセージがなくなるまで配信します。
「-1」を指定した場合、コンシューマに配信可能なメッセージの数は無制限となります。

整数値

1000

-1~2147483647


consumerFlowLimit20に設定する場合

C:\Interstage\F3FMisje6\mq\bin\imqcmd create dst -t q -n JMSQueue -o consumerFlowLimit=20

/opt/FJSVisje6/mq/bin/imqcmd create dst -t q -n JMSQueue -o consumerFlowLimit=20

注意

  • 自動生成された物理格納先のconsumerFlowLimitは1000に設定され、変更できません。

  • consumerFlowLimitを設定後、値を変更する場合は、物理格納先を一旦削除してから再度作成してください。


JMSクライアントのメモリ見積もり

メッセージブローカは事前配信処理を行うため、以下の式で使用するメモリを見積もってJMSクライアントを起動する必要があります。

(コンシューマの数 ×コンシューマが接続する物理格納先に設定されているconsumerFlowLimitの値 ×コンシューマが受信するメッセージサイズ) × 2 以上