Я задаюсь вопросом, возможно ли наблюдать событие 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;
}
}