複数のJSF2.0セッションスコープのバッキングBeanでCDIイベントを監視できるかどうか疑問に思っています。イベントを観察することで、イベント/データを複数のセッションにプッシュできると思いました。
ユーザーがページ上のボタンを使用してイベントを発生させることができる小さなテストを設定しました(これは、実際にイベントを発生させるセッションスコープのバッキングBeanのメソッドに関連付けられています)。2つの異なるブラウザーを開くと、2つのセッションが作成され、イベントが各セッションスコープのバッキングBeanに通知すると思いました。
ただし、小さなテストを実行し、ボタンをクリックしていずれかのブラウザーでイベントを発生させると、イベントがセッションスコープのBeanの1つにのみ通知することがわかります。イベントが発生したBeanにのみ通知します(つまり、ブラウザー1のボタンをクリックすると、ブラウザー1のセッションを支援するセッションスコープのBeanが通知され、ブラウザー2のボタンをクリックすると、セッションを支援するBeanが通知されます。ブラウザ2に通知されます)。
イベントがすべてのBeanインスタンスに通知するという印象を受けました。ただし、そうではないようです。私はこれを行うことができるべきですか?セットアップが間違っていますか?
私のコードがどのように見えるかを示すために更新します:
イベントを発生させ、セッションスコープのデータを表示するためのjsfpage.xhtmlのスニペット:
<h:form>
<h:outputText value="#{BackingBean.property}" />
<p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" />
</h:form>
イベントを受信するセッションスコープのBean:
@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();
}
}
イベントを発生させるアプリケーションスコープのBean:
@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;
}
}