фоновые темы кота
-
19-09-2019 - |
Вопрос
У меня запущен экземпляр Tomcat 6.20, и я хотел бы отправить электронное письмо через фоновый поток, чтобы функция отправки электронной почты не блокировала запрос.
Есть ли способ выполнить поток в фоновом режиме, сохраняя при этом нормальный поток страниц.
Приложение написано на ICEfaces.
Спасибо.
Решение
- Создать
Executor
с использованиемjava.util.concurrent.Executors.newCachedThreadPool
(или один из других фабричных методов) в методе инициализации вашего контроллера/сервлета. - Когда приходит запрос, оберните логику отправки почты в
java.lang.Runnable
- Отправьте
Runnable
кExecutor
Это позволит выполнить отправку в фоновом режиме.Не забудьте создать один исполнитель при запуске и использовать его для всех запросов;не создавайте каждый раз нового Исполнителя (можно было бы, но это было бы немного медленно и расточительно).
Другие советы
Поместите отправку электронной почты вместо Thread.sleep()
.Поместите свой вывод вместо sendRedirect()
.
public void doUrlRequest(HttpServletRequest request, HttpServletResponse response) {
try {
response.sendRedirect("/home");
} catch (IOException e) {
CustomLogger.info(TAG, "doUrlRequest", "doUrlRequest(): "+e.getMessage());
}
(new Thread() {
public void run() {
try {
Thread.sleep(9000);
System.out.println("Awoken!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
Я нашел выход.Эти теги
@PostConstruct()
и
@PreDestroy()
Создайте в своем сервлете 2 метода, которые возвращают void и не принимают никаких параметров.поместите 1-й тег непосредственно над первым методом, а 2-й тег — над вторым тегом.
Суть тегов
Метод @PostConstruct вызывается контейнером до того, как реализующий класс начнет отвечать клиентам веб-службы.
Метод @PreDestroy вызывается контейнером перед выводом конечной точки из работы.
внутри метода PostConstruction() создайте свой поток, используя работоспособный интерфейс, и запустите его в бесконечном цикле, если только значение определенной логической переменной не является ложным.
используйте метод PreDestroy(), чтобы установить логическую переменную в значение false.