Sometimes it's important to notify all client about an event or about changed records. This is known as “push”. You push a message to all clients. In web environments a websocket is used for push notification. In JVx we have a push mechanism which is technology independent and it works different in different UI technologies.
How to push a message to other clients?
In our example, we have a button and on button press we send a simple reload notification to all other clients. This is a super simple task.
The action event for the button looks like:
public void doSendNotification(UIActionEvent pEvent) throws Throwable { //saves all changes save(); //triggers push getConnection().callAction("doReloadAllClients"); }
In our life-cycle object, we need the doReloadAllClients
method:
public void doPublish() { ICallBackBroker broker = SessionContext.getCurrentCallBackBroker(); Thread th = new Thread(new Runnable() { public void run() { broker.publish("RELOAD", null, PublishMode.AllOtherMasterSessions); } }); th.start(); //with JVx 3.0, not additional thread is required //SessionContext.getCurrentCallBackBroker().publish("RELOAD", null, PublishMode.AllOtherMasterSessions); }
The reload event needs a handler. This handler/listener will be registered in our application:
public class CustomApplication extends Application implements ICallBackResultListener { @Override public void setConnection(AbstractConnection pConnection) { AbstractConnection con = getConnection(); if (con != null) { con.removeCallBackResultListener(this); } super.setConnection(pConnection); pConnection.addCallBackResultListener(this); } public void callBackResult(CallBackResultEvent pEvent) { if ("RELOAD".equals(pEvent.getInstruction())) { try { reload(); } catch (Throwable th) { error(th); } } } }
That's it.
But be careful, because push won't work in load-balanced applications with this standard implementation!