Отправка почты специальной веткой - PullRequest
1 голос
/ 10 ноября 2011

У меня есть приложение jsf, работающее на tomcat 6.0, и где-то в приложении я отправляю электронные письма некоторым пользователям. Но отправка почты медленнее, чем я думал, это вызывает недостатки между этими связанными страницами.

Так что мой вопросявляется;в том, что это хороший (или выполнимый) способ передать этот процесс другому потоку, который я создаю, потоку, который получает запросы на отправку почты и помещает их в очередь и обрабатывает их отдельно от основного приложения.основного потока и не влияет на скорость приложения.

1 Ответ

0 голосов
/ 10 ноября 2011

Да, это определенно хорошая идея.Вы должны делать это только с особой осторожностью.Вот кое-что для размышления:

Поскольку вы используете 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, обратитесь к официальному учебному пособию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...