фоновые потоки tomcat


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

Есть ли способ, которым я могу выполнить поток в фоновом режиме, все еще позволяя нормальному потоку страниц происходить.

Приложение написано в ледяных полях.

Спасибо.

3 2

3 ответа:

  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 () создайте поток с помощью интерфейса runnable и запустите его в бесконечном цикле, если значение определенной булевой переменной не равно false.

Используйте метод PreDestroy () для установки булевой переменной значения false.