Управляемый bean-компонент в области приложения умирает?

У меня есть управляемый компонент с областью действия приложения, основная цель которого — обслуживать остальную часть приложения с менее динамичными данными, такими как все доступные языки и еще несколько вещей.

Контроллер приложений

@ManagedBean(eager=true)
@ApplicationScoped
public class ApplicationController implements Serializable {
    private static final long serialVersionUID = 25488214212L;

    private List<Language> languages;
    private Map<Language, List<LevelDescription>> descriptionsPersonal;
    private Map<Language, List<LevelDescription>> descriptionsTechnical;
    private List<Integer> levels = new ArrayList<Integer>();

    @EJB private LanguageDao languageDao;
    @EJB private LevelDescriptionDao levelDescriptionDao;
    @EJB private IntraConnectionBean intraBean;
    @EJB private ApplicationBean appBean;

    public ApplicationController() {
    }

    @PostConstruct
    public void init(){
        languages = languageDao.findAll();
        descriptionsTechnical = new HashMap<Language, List<LevelDescription>>();
        descriptionsPersonal = new HashMap<Language, List<LevelDescription>>();
        for(int i = 0; i < 6; i++)
            levels.add(i);
        for(Language l : languages){
            List<LevelDescription> desc = levelDescriptionDao.findAll(l, true);
            if(!desc.isEmpty())
                descriptionsTechnical.put(l, desc);
            desc = levelDescriptionDao.findAll(l, false);
            if(!desc.isEmpty())
                descriptionsPersonal.put(l, desc);
        }
    }

    public List<Language> getLanguages(){
        if(lang)
        return languages;
    }

    public List<LevelDescription> getTechnicalItems(Language lang) {
        return descriptionsTechnical.get(lang);
    }

    public List<LevelDescription> getPersonalItems(Language lang) {
        return descriptionsPersonal.get(lang);
    }

    public List<Integer> getLevels(){
        return levels;
    }
}

Кажется, это работает нормально. Некоторое время. Когда я оставляю приложение в покое на некоторое время, может быть, на час, я получаю крайне странное поведение. Методы get, кажется, либо начинают возвращать пустые коллекции, либо возвращают коллекции с объектами, которые кажутся правильными, но не работают с публикацией selectOneMenus. Повторное развертывание заставляет его снова работать, что также затрудняет эксперименты, поскольку включение режима отладки заставит его снова работать путем повторного развертывания.

Какое временное событие могло вызвать это? Это не тайм-аут сеанса, я пробовал установить его на одну минуту и ​​позволить сеансу умереть, не вызывая этой проблемы, в основном это происходит утром после того, как сервер разработки работал всю ночь без помех. Все EJB не имеют состояния, и я не могу представить, чтобы они были проблемой. Возможно, это проблема сериализации?

Прошу прощения за такую ​​расплывчатость, возможно, я как-то неправильно понял, как работают bean-компоненты с областью действия приложения. Любая помощь будет оценена по достоинству.


person Rasmus Franke    schedule 16.02.2011    source источник
comment
Я хотел бы спросить вас, что такое язык добавлен? предполагается, что приложение всегда находится на сервере и работает, поэтому данные не будут изменены, если мы что-нибудь добавим..?   -  person Chaibi Alaa    schedule 13.09.2015
comment
Я сам решил эту проблему четыре года назад. Чтобы ответить на ваш вопрос. языки потенциально могут быть добавлены в новые выпуски приложения (что приведет к перезапуску сервера).   -  person Rasmus Franke    schedule 14.09.2015


Ответы (1)


Только что узнал, в чем была моя проблема: неправильно реализованный метод equals. Метод equals сравнивает идентификаторы объектов (Long) и использует == вместо Long.equals. Это приводило к тому, что равенство всегда было отрицательным, когда объекты жили дольше, чем кеш JPA (поскольку их физический адрес будет одинаковым, пока кеш не станет недействительным и не будет создан новый объект).

person Rasmus Franke    schedule 02.03.2011