Параллелизм управляемых bean-компонентов @ApplicationScoped JSF

Я использую Mojarra 2.2.12 и в нашем проекте у нас есть несколько @ApplicationScoped фасоль. Например:

@ManagedBean
@ApplicationScoped
public class AppScopedBean{

    private int commonValueForClients;

    //GET, SET

    public void evalNew(){
        int newCommonVal;
        //Evaluation of the new value, doesn't depend on the commonValueForClients
        commonValueForClients = newCommonVal;
    }
}

Мой вопрос: стоит ли беспокоиться о видимости нового назначенного значения?

Я не смог найти в спецификации, что инфраструктура JSF должна синхронизировать доступ к @ApplicationScoped бобовые поля. Так что, особенно для Мохарры 2.2.12, мы должны объявить поле как volatile или синхронизировать доступ к нему явно?

1 ответ

Решение

JSF не синхронизирует доступ к управляемым bean-компонентам в любой области.

Это ваша ответственность. Использовать существующие оболочки параллелизма / синхронизации в качестве типов полей, таких как AtomicInteger, ConcurrentHashMap, Collections#synchronizedList() и т. д. Используйте volatile только в крайнем случае, если такой обертки не существует.

Синхронизация изменяемых объектов определенно необходима в bean-объектах, определяемых приложением. В случае, например, HashMapв противном случае вы можете даже рискнуть застрять поток (100% ЦП). Это менее строго необходимо в сессионных компонентах, так как к ним будет доступ одновременно, только когда конечный пользователь открывает несколько HTTP-соединений в одном сеансе, и это будет по умолчанию, только когда два физически различных экземпляра браузера порождаются, но они, в свою очередь, по умолчанию уже не поделиться сессией. Так что это может произойти только в случае роботов / хакеров, и поэтому настоятельно рекомендуется позаботиться об этом и в bean-объектах сессионной области. Это почти не нужно с точки зрения области видимости bean-объектов, так как запросы ajax по спецификации поставлены в очередь, но в PrimeFaces их можно отключить <p:ajax async="true"> и вы должны принять это во внимание и в bean-объекте видимости. Это совершенно не нужно в запросе bean-компонентов.

В случае, если у вас есть CDI под рукой, вы также можете имитировать EJB @Lock аннотация с пользовательской аннотацией и перехватчиком CDI. Это подробно описано в блоге Стефана Кинтелиуса: Управление параллелизмом для CDI, по совпадению размещенного за день до вашего вопроса. Имейте в виду, что средство управления bean-компонентами JSF согласно JSF 2.3 устарело в пользу CDI. См. Также Бэк-бины (@ManagedBean) или CDI-бины (@Named)? Если вы можете, перейдите к CDI для управления бобами.

Другие вопросы по тегам