OSGi で宣言型サービスを使用しているときに、特別なユースケースに遭遇しました。
長時間の操作が完了したらすぐに ds コンポーネントにサービスを登録させたい場合があります。サービスは activate メソッドの終了後に登録されるため、通常はこれは問題になりません。ただし、(スレッドがブロックされないようにするために) activate メソッド内でスレッドを開き、スレッドが作業を終了したらサービスを登録する必要がある場合があります。
@Component
public class MyClass implements MyService {
private ExecutorService executor = Executors.newCachedThreadPool();
@Activate
public void start(final BundleContext context) {
executor.execute(new Runnable() {
@Override
public void run() {
... // doing something for long
context.registerService(MyService.class, MyClass.this, null);
}
});
}
}
まさにそれを行う util クラスを思いつきました (そして、スレッドがまだ実行されている間にコンポーネントが停止するなどの問題をカバーします)。そのようなことを行うより良い方法はありますか?そうでない場合は、そのような util クラスをフレームワークに追加すると便利ではないでしょうか?
敬具、マイク