7

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 のインスタンスを構成する必要がありますか?

4

1 に答える 1