FacesContext основан на HTTP-запросе и, таким образом, доступен только во время обработки HTTP-запроса и даже тогда, только когда URL-адрес запроса соответствует шаблону URL-адреса FacesServlet. Если вы не в потоке, который выполняется сервером для обработки HTTP-запроса, значит, FacesContext также не существует. В контейнере EJB нет абсолютно никаких средств HTTP-запросов.
Технически, единственный способ сообщить EJB JSF о новом сообщении - это позволить EJB запустить HTTP-запрос по URL-адресу, совпадающему с шаблоном URL-адреса FacesServlet, с сообщением в качестве параметра запроса. Вы можете использовать java.net.URLConnection
для этого. JSF, в свою очередь, может затем выполнить push-обработку Comet / HTTP, чтобы обновить представление сообщением IceFaces, как вы упомянули.
* 1006 Е.Г. *
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
, который прикреплен к поддерживающему компоненту следующим образом:
@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, но они должны быть достаточно понятны.