2013-09-12 4 views
3

Я сейчас ухожу от анкеты @Factory от Seam. В сочетании с @Observer, я мог бы сделать это:Как обновить коллекцию @Produces @ApplicationScoped?

@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> (фактическое вычисление может быть более сложным).

Я перевел для использования с КДИ в

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

но теряет способность воссоздавать кэш (только), когда внешнее событие сигнализирует кэш пошел несвежий. Как я могу получить это обратно?

ответ

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

Я думаю, что в действительности, это то, что вы хотите. Но я не исключаю возможности того, что могут быть различия - не очень сильно знаю Шейм.

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

+0

Вот чего я боялся. Я позабочусь о том, чтобы масштабировать это до десятков списков и принять после этого. – mabi

+0

Также +1 для подсказки синхронизации. Это область, о которой я не думал в этом контексте. – mabi

+0

@mabi Удостоверьтесь, что количество списков в худшем случае будет количеством раз, когда вы запускали 'MyCustomListIsStaleEvent' + 1. Тем не менее, если вы введете списки в запрос и бонусы с сессией, то действительно не будет будь то много. – rdcrng

Смежные вопросы