ManagedExecutorService または ManagedThreadFactory を介していくつかの処理を生成するアプリケーション スコープのサービス (JAX-RS/JAX-WS サービスまたはサーブレットにさらに注入することは問題ではありません) を実装しています。処理コード (Runnable インスタンス) 内で、EntityManager、DataSource、Web サービス参照などの注入されたリソースを使用したいと考えています。最初の解決策は次のようなものでした:
@ApplicationScoped
class MyService {
@Resource private ManagedExecutorService mes;
public void request(String param) {
mes.submit(new MyTask(param));
}
}
class MyTask implements Runnable {
// constructor skipped
@Resource private DataSource ds;
public void run() {
// do processing
}
}
MyTask.run() 内で、ds
フィールドが null のように見えます。これは、MyTask インスタンスがマネージド Bean ではないためです。つまり、DI コンテナーによって作成されたものではないため、インジェクションを使用できません。直接インスタンス化をコンテキスト インスタンスに変更しましょう。
@ApplicationScoped
class MyService {
@Resource ManagedExecutorService mes;
@Inject private Instance<MyTask> instance;
public void request(String param) { // <- no way to pass param to MyTask()!
mes.submit(instance.get());
}
}
これは希望どおりに機能します。しかし、これは私が望むものを達成するための正しい/最良の方法ですか? 一般に、問題は、実行時にオンデマンドで注入/管理されたインスタンスを作成する方法です。さらに、後者の場合、パラメーターを MyTask コンストラクターに渡すことができません。それはまったく可能ですか、または MyTask.setParam() メソッドを導入して MyTask のインスタンスを構成する必要がありますか?