Подтвердить что ты не робот

Происходят ли события CDI в рамках поддержки JSF с поддержкой сеанса beans

Я задаюсь вопросом, возможно ли наблюдать событие CDI с несколькими компонентами поддержки JSF 2.0 в рамках сеанса. Я думал, что смогу перенести событие/данные на несколько сеансов, наблюдая за событием.

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

Тем не менее, когда я запускаю мой маленький тест и нажимаю кнопку, чтобы запустить событие в одном из браузеров, я вижу, что событие уведомляет только один из bean-компонентов области действия. Он только уведомляет бин, из которого было сгенерировано событие (т.е. - если я нажимаю кнопку в браузере 1, бин с областью действия, поддерживающий сеанс в браузере 1, получает уведомление, а если я нажимаю кнопку в браузере 2, бин, поддерживающий сеанс в браузер 2 уведомлен).

У меня сложилось впечатление, что события будут уведомлять все экземпляры бобов. Тем не менее, это не так. Должен ли я быть в состоянии сделать это? У меня просто что-то не так с настройкой?

ОБНОВЛЕНИЕ, чтобы показать, как выглядит мой код:

Фрагмент jsfpage.xhtml для запуска события и отображения данных в области сеанса:

<h:form>
  <h:outputText value="#{BackingBean.property}" />
  <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" />
</h:form>

Сессионный компонент, получающий событие:

@Named
@SessionScoped
public class BackingBean implements Serializable {

    private String property;

    public String getProperty() {
        return property
    }

    public void listenForChange(@Observes EventObj event) {
        logger.log(Level.INFO, "Event received");
        property = event.toString();
    }
}

Бин области действия приложения для запуска события:

@Named
@ApplicationScoped
public class EventFirer implements Serializable {

    @Inject
    private Event<EventObj> events;

    public String fireEvent() {
        logger.log(Level.INFO, "Event fired");
        events.fire(new EventObj());
        return null;
    }
}
4b9b3361

Ответ 1

Сначала вы должны указать тип события:

@Inject
private Event<EventObj> events;

Кроме того, в спецификации нет указателей, которые ограничивали бы экземпляры bean, на которые вызывается метод наблюдателя. Я бы поставил вопрос об этом (в bugtracker реализации, которую вы используете. Возможно, Weld?)

Ответ 2

Я обнаружил, что все зарегистрированные наблюдатели уволены.

В первую очередь, если у меня есть наблюдатель на Scope bean и что bean не активен в текущем Разговоре, тогда, когда событие запущено, новый экземпляр создается специально для его получения!