第40章 スレッド管理

本章では、HornetQ がスレッドを使用およびプールする方法と、これらの管理方法について説明します。
最初に、サーバサイドでスレッドがどのように管理および使用されるかについて説明し、次に、クライアントサイドを見てみます。

40.1. サーバーサイドスレッド管理

各 HornetQ サーバーは、一般的な使用のために単一スレッドプールを維持し、スケジュール使用のためにスケジュールスレッドプールを維持します。Java のスケジュールスレッドプールは、標準的なスレッドプールを使用するよう設定できません。設定できる場合は、スケジュールおよび非スケジュールアクティビティの両方に対して単一スレッドプールを使用できます。
古い (ブロッキング) IO を使用する場合は、接続を処理するために別のスレッドプールが使用されます。古い IO では、1 つの接続に対して 1 つのスレッドが必要なため、標準的なプールから接続を取得することは適切ではありません。これは、非常に多くの接続が確立された場合にプールが簡単に枯渇し、処理を行うスレッドが残っていないため、サーバーが「ハングする」ことがあるためです。サーバーで多くの同時接続を処理する場合は、古い IO ではなく NIO を使用してください。
新しい IO (NIO) を使用する場合、HornetQ はデフォルトでコア, by default, use a number of threads equal to three times the number of cores (or hyper-threads) as reported by 受信パケットを処理するために Runtime.getRuntime().availableProcessors() により報告されたコア (またはハイパースレッド) の数を 3 倍した数に等しいスレッド数を使用します。この値を上書きするには、トランスポート設定でパラメーター nio-remoting-threads を指定してスレッド数を設定します。この詳細については、14章トランスポートの設定 を参照してください。
また、スレッドが直接使用される他の場所も少数存在します。

40.1.1. サーバースケジュールスレッドプール

定期的に実行する必要がある、または遅延で実行する必要があるサーバーサイドのほとんどのアクティビティに対してはサーバースケジュールスレッドプールが使用されます。これは、内部的に java.util.concurrent.ScheduledThreadPoolExecutor インスタンスに対してマッピングされます。
このプールで使用されるスレッドの最大数は JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xmlscheduled-thread-pool-max-size パラメーターを使用して設定されます。デフォルト値は 5 個のスレッドです。通常、このプールには少数のスレッドで十分です。

40.1.2. 汎用サーバースレッドプール

この汎用スレッドプールは、サーバーサイドのほとんどの非同期アクションに対して使用されます。これは、内部的に java.util.concurrent.ThreadPoolExecutor インスタンスに対してマッピングされます。
このプールで使用されるスレッドの最大数は JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xmlthread-pool-max-size パラメーターを使用して設定されます。
-1 の値が指定された場合、スレッドプールには上限がなく、要求を満たすのに十分なスレッドがないときに新しいスレッドが要求に応じて作成されます。後でアクティビティがなくなると、スレッドはタイムアウトになり、閉じられます。
n の値 (n はゼロ以外の正の整数) が使用された場合は、スレッドプールがバインドされることを意味します。さらに要求を受け取り、プールに空きスレッドがなく、プールがいっぱいの場合は、スレッドが利用可能になるまで要求がブロックされます。バインドされたスレッドプールは、上限が低く設定された場合にデッドロックの状況になることがあるため、注意して使用することが推奨されます。
thread-pool-max-size のデフォルト値は 30 です。
バインドされない (キャッシュ) スレッドプールとバインドされる (固定) スレッドプールの詳細については、J2SE Javadoc を参照してください。

40.1.3. 期限切れリーパースレッド

単一のスレッドは、キュー内の期限切れメッセージをスキャンするためにサーバーサイドでも使用されます。このスレッドは独自の設定優先度で実行する必要があるため、これに対するいずれかのスレッドプールを使用できません。
リーパーの設定の詳細については、20章メッセージの期限切れ を参照してください。

40.1.4. 非同期 IO

非同期 IO はイベントを受け取り、ネイティブレイヤーからディスパッチするスレッドプールを持ちます。これは接頭辞HornetQ-AIO-poller-pool のスレッドダンプにあります。HornetQ は、ジャーナルでオープン状態のファイルごとに 1 つのスレッドを使用します (通常は 1 つ存在します)。
また、libaio に対する書き込みを行うために使用する単一のスレッドも存在します。これにより、コンテキストの切り替えで発生するパフォーマンスの問題が回避されます。このスレッドは、接頭辞が HornetQ-AIO-writer-pool のスレッドダンプにあります。