FacesContext は HTTP 要求ベースであるため、HTTP 要求の処理中にのみ使用でき、その場合でも、要求 URL が FacesServlet の URL パターンと一致する場合にのみ使用できます。HTTP リクエストを処理するためにサーバーによって実行されるスレッド内にいない場合、FacesContext の手段もありません。EJB コンテナーには、HTTP 要求の手段がまったくありません。
技術的には、EJB が新しいメッセージについて JSF に通知できるようにする唯一の方法は、EJB が FacesServlet の URL パターンに一致する URL で HTTP リクエストを発行し、メッセージをリクエスト パラメータとして使用することです。これに使えますjava.net.URLConnection
。次に、JSFはComet/HTTPプッシュのようなものを実行して、あなたが言及したようにIceFacesの方法でメッセージでビューを更新できます。
例えば
URL url = new URL("http://example.com/context/poll.jsf?msg=" + URLEncoder(msg, "UTF-8"));
URLConenction connection = url.openConnection();
InputStream response = connection.getInputStream();
そして、poll.jsf
次のようにバッキング Bean にアタッチされます。
@ManagedBean
public class Poll {
@ManagedProperty(value="#{param.msg}")
private String msg;
@PostConstruct
public void init() {
// Do something with msg.
}
public void setMsg(String msg) {
this.msg = msg;
}
}
注: JSF 2.0 アノテーションを使用していますが、十分に自明である必要があります。