3

@Factory現在、Seam のアノテーションから移行中です。と組み合わせると@Observer、次のことができます。

@Factory(value = "optionsList", scope = ScopeType.APPLICATION)
@Observer("entity.modified")
public List<MyBean> produceEntityOptions() {
    List l = getEm().createQuery('select e from entity e').getResultList();
    Contexts.getApplicationContext().set("optionsList", l);
    return l;
}

たとえば、使用可能なオプションのリストをキャッシュします<f:selectItems>(実際の計算はより複雑になる可能性があります)。

CDIで使用するためにこれを翻訳しました

@Produces @Named("optionsList") @ApplicationScoped
public List<MyBean> produceEntityOptions() {
    return getEm().createQuery('select e from entity e').getResultList();
}

ただし、外部イベントがキャッシュが古くなったことを通知する場合にのみ、キャッシュを再作成する機能が失われます。どうすればそれを取り戻すことができますか?

4

1 に答える 1

3

できることは次のとおりです。

@ApplicationScoped
public class MyListProducer {

    // the current list
    private List<MyBean> listOfBeans;

    // resets / reloads/ refreshes list
    private void loadList() {
        this.listOfBeans = getEm().createQuery('select e from entity e').getResultList();
    }

    // initialize the list
    @PostConstruct
    protected void postConstruct() {
        loadList();
    }

    // listen for the stale event - you'll have to create a type (maybe even qualifiers) yourself
    private void resetList(@Observes MyCustomListIsStaleEvent evt) {
        loadList();
    }

    // the producer - to ensure that the producer is called after you refresh the list, make the list of scope @Dependent instead of @ApplicationScoped
    @Produces @Named("optionsList")
    protected List<MyBean> getList() {
        return this.listOfBeans;
    }
}

事実上、これはあなたが望むものだと思います。しかし、私は違いがある可能性を排除しません - Seam についてはあまり知りません。

補足: 単純な古い同期を使用するか、上記をステートフル セッション Bean にして EJB 同期メカニズムを利用することにより、オブザーバー メソッドとプロデューサー メソッドを同期することを検討する必要があります。

于 2013-09-12T21:35:52.787 に答える