メッセージブローカは、事前配信機能を使用してコンシューマにメッセージを配信します。
事前配信機能を使用することにより、コンシューマの受信処理は、メッセージブローカとの通信が不要となるため、通信のオーバーヘッドが軽減されます。
以下に事前配信処理を説明します。
単一コンシューマの事前配信処理
物理格納先から1つのコンシューマに事前配信される処理概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。
[処理の流れ]
コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。
上記の図の場合、メッセージブローカは、メッセージ3件(A,B,C)を事前配信します。
コンシューマがメッセージの受信要求を行うと、事前配信されたメッセージが格納されている一時格納域に対してメッセージの配信を要求します。
コンシューマは、メッセージ(A)を受信します。
複数コンシューマの事前配信処理(蓄積メッセージあり)
メッセージが蓄積されている物理格納先から複数のコンシューマに事前配信される処理概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。
[処理の流れ]
プロデューサが物理格納先にメッセージを5件(A,B,C,D,E)送信します。
コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。
上記の図の場合、メッセージブローカは、メッセージ3件(A,B,C)を配信します。
コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
物理格納先に設定されたconsumerFlowLimitを上限として、コンシューマに配信可能なメッセージを事前配信します。
上記の図の場合、メッセージブローカはメッセージ2件(D,E)を配信します。
コンシューマは、メッセージ(A,B,C)の順番に受信します。
メッセージ(D,E)は、JMSクライアント2に事前配信済であるため、受信できません。
コンシューマは、メッセージ(D,E)の順番に受信します。
メッセージ(A,B,C)は、JMSクライアント1に事前配信済であるため、受信できません。
複数コンシューマの事前配信処理(蓄積メッセージなし)
メッセージが蓄積されていない物理格納先から複数のコンシューマに事前配信される概要を、以下の図に示します。
Message-driven Beanの場合も同様に事前配信処理が行われます。
以下の図のコンシューマを、Message-driven Beanと読み替えてください。
[処理の流れ]
コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
しかし、物理格納先にメッセージが蓄積されていないため、事前配信が実施されません。
コンシューマがコネクションを開始すると、メッセージブローカに対して事前配信を要求します。
しかし、物理格納先にメッセージが蓄積されていないため、事前配信が実施されません。
プロデューサが物理格納先にメッセージを5件(A,B,C,D,E)送信します。
メッセージブローカは、物理格納先に設定されたconsumerFlowLimitを上限として、物理格納先に蓄積されたメッセージをランダムに振り分けます。
上記の図の場合は、以下を行います。
JMSクライアント1にメッセージ3件(A,C,D)を事前配信します。
JMSクライアント2にメッセージ2件(B,E)を事前配信します。
コンシューマは、メッセージ(A,C,D)の順番に受信します。
メッセージ(B,E)は、JMSクライアント2に事前配信済であるため、受信できません。
コンシューマは、メッセージ(B,E)の順番に受信します。
メッセージ(A,C,D)は、JMSクライアント1に事前配信済であるため、受信できません。
consumerFlowLimitの設定
コンシューマに事前配信するメッセージの数は、物理格納先の作成時に、consumerFlowLimitプロパティを設定することで変更できます。
物理格納先の作成は、imqcmdコマンドのcreate dstサブコマンドを使用して行います。詳細については、「9.5.1 create dstサブコマンド」を参照してください。
プロパティ | 構成情報 | 設定値 | 省略値 | コマンドでの設定 |
---|---|---|---|---|
consumerFlowLimit | 物理格納先にメッセージが蓄積されている場合、本プロパティで設定したメッセージ数を一単位としてメッセージの受信処理を行うコンシューマに、蓄積されたメッセージがなくなるまで配信します。 | 整数値 | 1000 | -1~2147483647 |
例
consumerFlowLimitを20に設定する場合
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 以上