私はjsfアプリケーションをtomcat 6.0上で実行しています。アプリのどこかで私はいくつかのusers.Butにメールを送りますが、私は思ったより遅くメールを送ります。特別なスレッドでメールを送信する
私の質問です。私が作成した別のスレッド、要求を送信したメールを取得してキューに入れ、メインアプリケーションから離れて処理するスレッドにこのプロセスを提供するための良い(または実行可能な)方法です。主な流れのそれはアプリのスピードに影響しません。
私はjsfアプリケーションをtomcat 6.0上で実行しています。アプリのどこかで私はいくつかのusers.Butにメールを送りますが、私は思ったより遅くメールを送ります。特別なスレッドでメールを送信する
私の質問です。私が作成した別のスレッド、要求を送信したメールを取得してキューに入れ、メインアプリケーションから離れて処理するスレッドにこのプロセスを提供するための良い(または実行可能な)方法です。主な流れのそれはアプリのスピードに影響しません。
はい、間違いなく良いアイデアです。あなたは極度の注意を払ってそれを行うべきです。ここで思考のためのいくつかの食べ物です:
あなたが箱からEJBをサポートする(したがって@Asynchronus
@Singleton
問題外です)しない、Tomcatを使用しているため、Iメールタスクを処理するためにExecutorService
を保持するアプリケーションスコープのBeanを作成します。キックオフの例を次に示します。
@ManagedBean(eager=true)
@ApplicationScoped
public class TaskManager {
private ExecutorService executor;
@PostConstruct
public void init() {
executor = Executors.newSingleThreadExecutor();
}
public <T> Future<T> submit(Callable<T> task) {
return executor.submit(task);
}
// Or just void submit(Runnable task) if you want fire-and-forget.
@PreDestroy
public void destroy() {
executor.shutdown();
}
}
これは、1つのスレッドを作成し、タスクをキューに入れます。次のようにして、通常の豆でそれを使用することができます。
@ManagedBean
@RequestScoped
public class Register {
@ManagedProperty("#{taskManager}")
private TaskManager taskManager;
public void submit() {
// ...
taskManager.submit(new MailTask(mail));
// You might want to hold the return value in some Future<Result>, but
// you should store it in view or session scope in order to get result
// later. Note that the thread will block whenever you call get() on it.
// You can just ignore it altogether (as the current example is doing).
}
}
をofficial tutorialを参照してください、java.util.concurrent
APIの詳細については。