メッセージブローカは、事前配信機能を使用してコンシューマにメッセージを配信します。
事前配信機能を使用することにより、コンシューマの受信処理は、メッセージブローカとの通信が不要となるため、通信のオーバーヘッドが軽減されます。
注意
jms接続サービスを使用してJMSメッセージの送受信を行う場合は、事前配信機能が動作します。
メッセージブローカをEMBEDDED運用し、WebアプリケーションまたはEJBアプリケーションでJMSを使用する場合は、jmsdirect接続サービスを使用してTCP通信を介さずにJMSメッセージの送受信を行うため、事前配信機能はデフォルトで動作しません。
以下に事前配信処理を説明します。
単一コンシューマの事前配信処理
物理格納先から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に事前配信済であるため、受信できません。
JMSクライアントのメモリ見積もり
メッセージブローカは事前配信処理を行うため、以下の式で使用するメモリを見積もってJMSクライアントを起動する必要があります。
(コンシューマの数 ×コンシューマが接続する物理格納先に設定されているconsumerFlowLimitの値 ×コンシューマが受信するメッセージサイズ) × 2 以上