Как исправить утечку потока в приложении JSF? - PullRequest
1 голос
/ 02 октября 2011

У меня есть компонент ApplicationScoped, который запускает отдельный поток для выполнения некоторой фоновой работы.Поток имеет метод для чистого завершения, который называется terminate () .Если не завершить с помощью этого метода, он работает в бесконечном цикле и некоторое время спит, если обнаруживает, что не имеет никакого отношения.Я перекомпилирую приложение, плагин Maven выполняет развертывание и повторное развертывание приложения (удобнее всего сказать), но фоновый поток из развертывания last висит.В конечном итоге он завершается с исключением, потому что он выходит из спящего режима и пытается получить доступ к JPA EntityManager, которого больше нет.

Я бы предпочел автоматически вызывать метод terminate () , когда приложение остановлено.Есть ли способ реализовать слушатель, который сделает это на уровне спецификации JSF 2.0?Если нет, то как на уровне сервлетов?

Это использует GlassFish 3.1.1.

1 Ответ

2 голосов
/ 02 октября 2011

Добавьте к вашему бобу метод @PreDestroy, который будет запускаться, когда ваше приложение отменено или остановлено, и может остановить фоновый поток, например:

import javax.annotation.PreDestroy;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ApplicationScoped
@ManagedBean
public class AppBean {

    public AppBean() {
        System.out.println("new AppBean()");
    }

    @PreDestroy
    public void preDestory() {
        // call thread.terminate() here
        System.out.println("preDestory");
    }
}
...