Возможно ли обновить JSF-компонент от слушателя Cometd поддержки Бина?
Может ли прослушиватель cometd вызывать "RequestContext.getCurrentInstance ()"?
sayHello () может работать, но addRow() не работает.
Кажется, RequestContext не может получить текущий экземпляр или я на неправильном пути? (Org.primefaces.context.RequestContext)
Спасибо.
Вот вывод:
Бин получил сообщение: 2
готов к получению текущего экземпляра
org.cometd.bayeux.client.ClientSession - Исключительная ситуация при вызове bean-компонента слушателя. AlarmBean$NodeLsnr@7e33d20f
java.lang.NullPointerException в bean.AlarmBean.addRow(AlarmBean.java:48) в bean.AlarmBean$NodeLsnr.onMessage(AlarmBean.java:57) в
org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyOnMessage(AbstractClientSession.java:432)
Код:
@Named("AlarmBean")
@ViewScoped
public class AlarmBean implements Serializable {
private String defaultURL = "http://localhost:31360/topoServer/cometd/foo";
private BayeuxClient client;
private static final String NODE_CHANNEL = "/node";
private NodeLsnr NL = new NodeLsnr();
private int i = 1;
@PostConstruct
public void initComted(){
initClient();
}
public void sayHello() {
i++;
System.out.println("Bean received Msg : " + Integer.toString(i));
}
public void addRow() {
System.out.println("ready to getCurrentInstance");
RequestContext.getCurrentInstance().update("f1:table1");
}
private class NodeLsnr implements ClientSessionChannel.MessageListener {
@Override
public void onMessage(ClientSessionChannel csc, Message msg) {
System.out.println("data received ");
sayHello();
addRow();
}
}
public void initClient() {
HttpClient httpClient = new HttpClient();
try {
httpClient.start();
} catch (Exception ex) {
return;
}
Map<String, Object> options = new HashMap<>();
ClientTransport longPool = LongPollingTransport.create(options, httpClient);
client = new BayeuxClient(defaultURL, longPool);
client.handshake();
boolean handshaken = client.waitFor(10000, BayeuxClient.State.CONNECTED);
if (handshaken) {
System.out.println("connected ok");
client.getChannel("/node").subscribe(NL);
System.out.println("subscribe to /node channel.");
}
}
}