Наблюдаются ли события CDI в компонентах поддержки JSF с ограниченным объемом сеанса

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

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

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

У меня создалось впечатление, что события будут уведомлять все экземпляры bean-компонентов. Однако, похоже, это не так. Могу ли я это сделать? Я просто неправильно что-то настроил?

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

Фрагмент 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;
    }
}
10
задан YoYo 3 April 2019 в 20:11
поделиться