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