Область применения приложения Управляемый компонент умирает? - PullRequest
3 голосов
/ 16 февраля 2011

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

ApplicationController

@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. Повторное развертывание заставляет его работать снова, что также затрудняет эксперименты, так как включение режима отладки заставит его работать снова путем повторного развертывания.

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

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

1 Ответ

0 голосов
/ 02 марта 2011

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

...