Java EE 6 では@Asynchronous
、EJB メソッドにアノテーションを付けて、そのメソッドでの作業を特別なスレッドプールで処理することができます。
@Stateless
public class SomeBean {
@Asynchronous
public void doSomething() {
// ...
}
}
次に、別の場所で、この Bean を注入してdoSomething()
メソッドを呼び出します。コントロールはすぐに戻ります。
@WebServlet("/test")
public class SyncServlet extends HttpServlet {
@EJB
private SomeBean someBean;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
someBean.doSomething();
}
}
ここのようなものは必要ないかもしれないAsyncContext asyncContext = request.startAsync()
ことに注意してください。これは、非同期コードが応答に何かを送信する必要がある場合にのみ使用します。
ただし、期間タイマーに似たものが必要で、リクエストに応じて何かを行わない場合は、シングルトンでタイマー サービスを使用できます。
@Startup
@Singleton
public class SomeTimerBean {
@Schedule(hour = "*", minute = "*/30", second = "0", persistent = false)
public void doStuff() {
// ...
}
}
定期的に実行する代わりに、@TimeOut
アノテーションを使用して次のようなものを 1 回実行することもできます。
@Startup
@Singleton
public class SomeTimerBean {
@Resource
private TimerService timerService;
@Postconstruct
public void init() {
timerService.createSingleActionTimer(0, new TimerConfig(null, false));
}
@Timeout
public void doStuff(Timer timer) {
// ...
}
}
これにバリエーションを持たせることができます。たとえば、基本的に同じ効果を得るために、他のBean のメソッドをSomeTimerBean
呼び出すこともできます。@Asynchronous