必須の警告:Java EEアプリサーバー(Tomcatでも)で独自のスレッドを作成することは、パフォーマンスの大きな問題になる可能性があり、ほとんどの場合、JNDIなどのコンテナー機能が機能しなくなるためお勧めしません。新しいスレッドは、それらがどのアプリケーションに属しているかを認識せず、スレッドコンテキストクラスローダーが設定されず、他の多くの隠れた問題が発生します。
@Asynchronous
幸い、JavaEEサーバーにJavaEE6とこの巧妙なデザインパターンを介してスレッドプールを管理させる方法があります。JavaEE6認定サーバーに移植可能。
アプリケーションでこのEJBを作成します。
package org.superbiz;
import javax.ejb.Asynchronous;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
@Stateless(name="Executor")
public class ExecutorBean implements Executor {
@Asynchronous
@Override
public void execute(Runnable command) {
command.run();
}
}
次に、プレーンな依存性注入を介して、アプリケーションの他の場所でこのBeanを参照できます(参照するコンポーネントがサーブレット、リスナー、フィルター、その他のEJB、JSFマネージドBeanの場合)。
@EJB
private Executor executor;
その後、Executor
通常どおりに使用します。
コンポーネントが別のJavaEEコンポーネントでない場合は、次の方法でBeanを検索できます。
InitialContext initialContext = new InitialContext();
Executor executor = (Executor) initialContext.lookup("java:module/Executor");