Вопрос

У меня запущен экземпляр Tomcat 6.20, и я хотел бы отправить электронное письмо через фоновый поток, чтобы функция отправки электронной почты не блокировала запрос.

Есть ли способ выполнить поток в фоновом режиме, сохраняя при этом нормальный поток страниц.

Приложение написано на ICEfaces.

Спасибо.

Это было полезно?

Решение

  1. Создать Executor с использованием java.util.concurrent.Executors.newCachedThreadPool (или один из других фабричных методов) в методе инициализации вашего контроллера/сервлета.
  2. Когда приходит запрос, оберните логику отправки почты в java.lang.Runnable
  3. Отправьте 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top