arrow_back history picture_as_pdf This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ~~NOTRANS~~ ~~Title: Publish/Push messages~~ A standard JVx application requests data from the server side via [[jvx:communication:connections|Connection]]. This concept doesn't support sending messages from the server to the client side. In JVx we have a keep alive mechanism and this usually checks, every 30 seconds, if the connection to the server-side is still valid. This alive check can be used to send properties to the client, using [[jvx:communication:client_server_properties|connection properties]]. It's also known as server-side polling mechanism. But this mechanism isn't the best approach for sending any kind of information to the client-side. To solve this problem, we introduced the Callback Broker on server-side. This broker is available for any session via [[jvx:server:lco:sessioncontext|SessionContext]]. It makes it possible to send any object to the client-side. The client-side is able to listen to so called call-back calls and e.g. change the UI or trigger data updates. A call-back call is not the same as an [[jvx:communication:async_callback|async call]]. The difference is that an async call will be triggered from the client-side and starts a new Thread on server-side, for the execution. A call-back call is triggered from the server-side and sends information to the client-side. If you publish a message, it's not guaranteed that the message will be pushed immediately to the client-side. This is technology dependent, e.g. it will work immediately with [[vaadin:home|Vaadin UI]] because websockets are supported. If the technology doesn't support push, the pull mechanism via alive check will be used. So it's guaranteed that the client-side receives the message as soon as possible. If you want to use the publish mechanism, simply register a listener on your connection: <code java> ICallBackResultListener listener = new ICallBackResultListener() { public void callBackResult(CallBackResultEvent pEvent) throws Throwable { if ("COUNT_ADD".equals(pEvent.getInstruction())) { counter += ((Integer)pEvent.getObject()).intValue(); } } } AbstractConnection con = getConnection(); con.addCallBackResultListener(listener); </code> To send a message, simply call: <code java> SessionContext.getCurrentInstance().getCallBackBroker().publish("COUNT_ADD", Integer.valueOf(1)); </code> on the server-side. But be careful if you run in a Thread, because the broker won't be available outside the server execution thread. So, use a cached instance of the broker, e.g.: <code java> final ICallBackBroker broker = SessionContext.getCurrentInstance().getCallBackBroker(); Thread th = new Thread(new Runnable() { private int i = pStart; public void run() { //... server logic broker.publish("COUNT_ADD", Integer.valueOf(i++)); } }); th.start(); </code> The ICallBackBroker interface defines an enum for the PublishMode: <code java> public enum PublishMode { /** only the current session. */ CurrentSession, /** other sessions from the current master session. */ OtherSessions, /** only the master of the current session. */ CurrentMasterSession, /** all sessions which are like the current session, and the current session. */ AllCurrentSessions, /** all sessions which are like the current session, but not the current session. */ AllOtherSessions, /** all master sessions. */ AllMasterSessions, /** all master sessions but not the master session of the current session. */ AllOtherMasterSessions } </code> If you don't use a specific mode, the CurrentSession mode will be used as default setting.