3

私はアプリケーションスコープのマネージドBeanを持っています。その主な目的は、利用可能なすべての言語やその他のいくつかの言語など、動的でないデータをアプリケーションの残りの部分に提供することです。

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;
    }
}

これはうまくいくようです。しばらくの間。アプリケーションをしばらく(おそらく1時間)そのままにしておくと、非常に奇妙な動作をします。get-methodsは、空のコレクションを返すか、適切に見えるがselectOneMenusの投稿では機能しないオブジェクトを含むコレクションを返すように見えます。再デプロイすると再び機能します。また、デバッグモードをオンにすると再デプロイによって再び機能するため、実験が困難になります。

どのような時間ベースのイベントがこれを引き起こす可能性がありますか?これはセッションのタイムアウトではありません。1分に設定して、この問題を引き起こさずにセッションを終了させることをテストしました。ほとんどの場合、開発サーバーが一晩中邪魔されずに実行された後の朝に発生します。すべてのEJBはステートレスであり、それらが問題であるとは想像できません。おそらくシリアル化の問題でしょうか?

非常に拡散していることをお詫びします。アプリケーションスコープのBeanがどのように機能するかをどういうわけか誤解している可能性があります。どんな助けでもいただければ幸いです。

4

1 に答える 1

0

私の問題が何であるかを知りました:正しく実装されていないequalsメソッド。equalsメソッドは、オブジェクトのID(Long)を比較し、Long.equalsの代わりに==を使用します。これにより、オブジェクトがJPAキャッシュよりも長く存続した場合、等式は常に負になりました(キャッシュが無効になり、新しいオブジェクトが作成されるまで、オブジェクトの物理アドレスは同じであるため)。

于 2011-03-02T11:55:46.900 に答える