Да, это определенно хорошая идея.Вы должны делать это только с особой осторожностью.Вот кое-что для размышления:
Поскольку вы используете Tomcat, который не поддерживает EJB из коробки (и, таким образом, @Asynchronus
@Singleton
не подлежит обсуждению), ясоздал бы боб области приложения, который содержит ExecutorService
для обработки почтовых задач.Вот начальный пример:
@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();
}
}
Это создает отдельный поток и помещает задачи в очередь.Вы можете использовать его в обычных bean-компонентах следующим образом:
@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).
}
}
Чтобы узнать больше о java.util.concurrent
API, обратитесь к официальному учебному пособию .