スレッド

Camelでは、通常シングルスレッドにより処理されますが、Splitterなどで複数スレッドを使うことでパフォーマンスをあげることができます。 スレッドを使う際には、スレッドプールを定義する必要があります。

スレッドプールは、複数スレッドを管理し、タスクキューから取得したタスクを空いているスレッドに割り当てて実行します。 タスクが多いときは、管理するスレッドを一時的に生成してタスクを実行します。


スレッドプール

スレッドプール・プロファイル

Camelでは、スレッドプールを直接には生成せずに、上記で示したpoolSizemaxQueueSizeなどのオプションを管理するスレッドプール・プロファイル(以下プロファイル)をもとに生成します。

何も設定しなければ、次のデフォルト値を持つプロファイルを使用してスレッドプールが生成されます。

 オプション デフォルト値 説明
poolSIze 10 スレッドプールで管理するスレッド数
maxPoolSize20スレッド数の最大値
keepAliveTime60 追加で生成したスレッドがアイドル状態で待機する秒数。この時間を過ぎると破棄される。
maxQueueSize1000タスクキューに追加可能なタスク数
rejectedPlociyCallerRunsタスクキューに追加できない場合の処理。CallerRuns, Abort, DiscardOldest, Discardを設定可能。

<!– TODO rejectedPolicyについて書く –>

デフォルト スレッドプール・プロファイル

すべてのアプリケーションに最適なオプション値というのはありませんので、アプリケーションごとに調整するこもできます。しかし、通常デフォルト値を使うことが推奨されます。

カスタマイズする必要がある場合は、次のように定義します。

        <threadPoolProfile id="MyDefaultThreadPool" defaultProfile="true"
                           poolSize="5" maxPoolSize="5" maxQueueSize="10000"
                           keepAliveTime="60" rejectedPolicy="CallerRuns" />

デフォルトのプロファイルには、defaultProfiletrueに設定する必要があります。

カスタム スレッド・プロファイル

デフォルトとは異なるオプションを使用したい場合は、別途定義します。定義の仕方は、defaultProfile属性は指定しないこと以外デフォルト スレッド・プロファイルと同じですが、デフォルト スレッド・プロファイルのオプションの値を継承するので、変更するオプションだけ指定します。

        <threadPoolProfile id="MyCustomThreadPool" 
                           <!-- maxQueueSize、keepAliveTimeおよびrejectedPolociyは継承する -->
                           poolSize="10" maxPoolSize="10" />

上記の例で、maxPoolSizeを省略するとデフォルト スレッド・プロファイルの継承するので5になりますが、poolSizeに値より小さくなるため、エラーが発生します。このように、矛盾が生じる場合は省略できません。

スレッド・プロファイルの使用

Splitterなどでは、executerServiceRef属性に定義したプロファイルのIDを指定することで、そのプロファイルにもとづきスレッドプールを生成し使用します。

            <!-- カスタム スレッド・プロファイルを使用 -->
            <!-- executorServiceRefを指定すると、自動的にparallelProcessingが有効になる -->
            <split executorServiceRef="MyCustomThreadPool">
                <simple>${body}</simple>
                <log message="(2) ${body}." />
            </split>    

executerServiceRef属性を指定せずに、parallelProcessing属性を使用すると、デフォルトのプロファイルをもとにスレッドプールを生成し使用します。デフォルトのプロファイルが定義されていない場合は、プロファイルのデフォルト値をもとに生成されます。

スレッドプール

プロファイルを使用せずに、直接スレッドプールを定義することも可能です。オプションは同じですが、threadName属性でスレッド名を指定することができます。

        <threadPool id="MyThreadPool" poolSize="10" maxPoolSize="15" 
                    maxQueueSize="100" rejectedPolicy="Abort" keepAliveTime="30" 
                    threadName="MyThread" />

使用方法も同様で、executorServiceRef属性で指定します。

参考情報