1前書き

「MDB」とも呼ばれるメッセージ駆動型Beanは、非同期のコンテキストでメッセージ処理を処理します。 MDBの基本はhttps://www.baeldung.com/ejb-message-driven-beans[この記事]で学ぶことができます。

このチュートリアルでは、メッセージ駆動型Beanを使用して並行性を実装するためのいくつかの戦略とベストプラクティスについて説明します。

Javaを使った並行処理の基本についてもっと知りたいなら、https://www.baeldung.com/java-concurrency[ここ]を始めてください。

MDBと並行性をよりよく使用するために、いくつか考慮すべき点があります。 ** これらの考慮事項は、ビジネスルールとアプリケーションのニーズによって左右される必要があることに留意してください。


2スレッドプールの調整

スレッドプールの調整は、おそらく主な注意点です。並行処理をうまく利用するには、メッセージを消費するために利用可能なMDBインスタンスの数を調整する必要があります。あるインスタンスがメッセージの処理に忙しいとき、他のインスタンスが次のインスタンスを拾うことができます。


MessageListener

スレッドは、MDBの

onMessage

メソッドを実行します。このスレッドは

MessageListener

スレッドプールの一部です。つまり、プールされ、何度も何度も再利用されます。このプールには、パフォーマンスに影響を与える可能性があるスレッド数を設定できるようにする設定もあります。

  • 小さなプールサイズを設定するとメッセージの消費が遅くなります

(「MDB調整」)
** 非常に大きなプールサイズを設定するとパフォーマンスが低下する可能性があります。

まったく動作しません。


Wildfly

では、管理コンソールにアクセスしてこの値を設定できます。

デフォルトのスタンドアロンプ​​ロファイルではJMS機能は有効になっていません。

full profile

を使用してサーバーを起動する必要があります。

通常、ローカルインストールでは、http://127.0.0.1:9999/console/index.htmlを通じてアクセスします。その後、Configuration/Subsystems/Messaging/Serverにアクセスし、サーバーを選択して[View]をクリックする必要があります。

[属性]タブを選択し、[編集]をクリックして、[スレッドプール最大サイズ]の値を変更します。デフォルト値は30です。


3最大セッション数の調整

注意すべきもう1つの設定可能なプロパティは

最大セッション数

です。これは特定のリスナーポートの同時実行性を定義します。通常、これは1がデフォルトですが、値を大きくするとMDBアプリケーションのスケーラビリティと可用性が向上します。

アノテーションまたは

.xml

記述子のどちらかによってそれを設定することができます。注釈を通じて、

@ ActivationConfigProperty

を使用します。

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(
        propertyName=”maxSession”, propertyValue=”50”
    )
})

選択した設定方法が

.xml

記述子の場合、

maxSession

を次のように設定できます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>maxSession</activation-config-property-name>
        <activation-config-property-value>50</activation-config-property-value>
    </activation-config-property>
</activation-config>


4展開環境

高可用性が求められる場合は、MDBをアプリケーションサーバークラスタにデプロイすることを検討する必要があります。したがって、クラスタ内の任意のサーバー上で実行でき、多くのアプリケーションサーバーが同時にそれを呼び出すことができるため、スケーラビリティも向上します。

この特定のケースのために、私達は作るために重要な選択があります:

  • クラスタ内のすべてのサーバがメッセージを受信できるようにします** 。

そのすべての処理能力の使用を許可する
1つだけ許可することで、順次処理でメッセージ処理を確実に行う

一度に


それらを受け取るサーバー**

エンタープライズバスを使用する場合は、MDBをバスメンバーと同じサーバーまたはクラスターにデプロイしてメッセージングパフォーマンスを最適化することをお勧めします。


5メッセージモデルとメッセージタイプ

これは、プールに別の値を設定するだけでは明確ではありませんが、メッセージモデルとメッセージタイプは、同時実行性を使用することの最大の利点の1つ、パフォーマンスに影響を与える可能性があります。

たとえば、メッセージタイプとしてXMLを選択した場合、

メッセージのサイズが

処理に費やされる時間に影響を与える可能性があります。これは、アプリケーションが大量のメッセージを処理する場合は特に重要な考慮事項です。

メッセージモデルに関して、

アプリケーションが同じメッセージを多くのコンシューマに送信する必要がある場合は、

publish-subscribe

モデルが正しい選択かもしれません

。これにより、メッセージ処理のオーバーヘッドが軽減され、パフォーマンスが向上します。

パブリッシュ – サブスクライブモデルの

Topic

から消費するには、アノテーションを使用できます。

@ActivationConfigProperty(
  propertyName = "destinationType",
  propertyValue = "javax.jms.Topic")

繰り返しになりますが、

.xml

デプロイメント記述子でこれらの値を構成することもできます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>destinationType</activation-config-property-name>
        <activation-config-property-value>javax.jms.Topic</activation-config-property-value>
    </activation-config-property>
</activation-config>

同じメッセージを多くの消費者に送信することが要件ではない場合、通常のPTP(Point-to-Point)モデルで十分です。

Queueから消費するには、アノテーションを次のように設定します。

@ActivationConfigProperty(
  propertyName = "destinationType",
  propertyValue = "javax.jms.Queue")


.xml

デプロイメント記述子を使用している場合は、それを設定できます。

<activation-config>
    <activation-config-property>
        <activation-config-property-name>destinationType</activation-config-property-name>
        <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
    </activation-config-property>
</activation-config>


6. 結論

多くのコンピュータ科学者やITライターがすでに述べたように、私たちはもはやプロセッサの速度が速いペースで速くなることはありません。私たちのプログラムをより速く動かすためには、今日利用可能なより多くのプロセッサとコアを使って作業する必要があります。

この記事では、MDBを使用して並行処理を最大限に活用するためのベストプラクティスについて説明しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です