关于ZK框架的服务推实现,ZK3 和ZK5 有着很大的不同。这也是在small talk和how―to wiki里面看到的。
?? server-push服务推技术的兴起主要是因为http的无状态链接,导致服务端有什么信息, 比较难推到客户端。传统的ajax的形式,就是客户端不停的向服务端发出请求,来取得服务端的信息。现在server-push有多种方式, 有兴趣的可以去了解一下。ZK框架对于server-push也是实现了多种方式。
????? 像第一篇文章里面那样, java 服务端完全有可能操作客户端的组件,服务端和客户端的紧密使得服务推在这里没有多大的作用,不过还是介绍一下吧。?????
???? ZK早期的的server-push实现方式:
????? 其实现分为几个步骤:1,开启界面的server-push 2,创建服务端的java线程,并且把界面元素作为参数传递给java线程,主要是因为要不停的发信息给客户端所以开线程。 3,在java线程开启的时候,也一样要开启desktop的server-push,且在发送信息之前要使用Executions.active(desktop) ,将信息发送完成后,需要deactive,并且enable desktop的server-push功能。??
????? 特点:常规的服务端java对客户端进行控制的话,需要extends ZK框架里面的自带的composer类或者是Window类,以这种方式就可以传递desktop,操作其desktop,并且可以继承其他的类型,完成更多的功能。
?
????? 案例:(参考官方提供)?
????? a.zul 里面在zscript里面开启客户端desktop的server-push功能。开启java线程。(ps.使用zscript通过language属性指定可以嵌入并运行很多中脚本语言javascript等)?
//开启desktop的服务推 if(!desktop.isServerPushEnabled()){ desktop.enableServerPush(true); } XYModel xymodel=new SimpleXYModel(); timeseries.setModel(xymodel); //开启服务端的java线程。并传递需要实时更新的组件。 ins.ZKServerPush.StockEx.StockChartUpdate scp=new ins.ZKServerPush.StockEx.StockChartUpdate(timeseries); scp.start();
?
???? a.java?
????
public void run() { if (!_desktop.isServerPushEnabled()) //发送开启 _desktop.enableServerPush(true); try { while (!_ceased) { //激活 Executions.activate(_desktop); try { updateChart(); } finally {//停滞 Executions.deactivate(_desktop); } Threads.sleep(2000); } } catch (Exception ex) { System.out.println(“error!!!!”); } finally { if (_desktop.isServerPushEnabled()) //发送关闭 _desktop.enableServerPush(false); } }
?
?? 改进版:在上个案例中后台数据的改变就得改变组件形态并更新一番,在这使用SimpleListModelShare 可以在后台数据改变的时候,客户端组件自动更新。
?? 1,指定哪个数据,stockModel.?
modelSharer = new SimpleListModelSharer(stockModel);
???2,指定代理的桌面?
public ListModel getProxy(Desktop desktop) { return modelSharer.getProxy(desktop); }
?? ?当stockModel的数据改变的时候,组件中使用stockModel的也会更随改变。
??? 近期常用的方式, 使用EventQueues在application、session等灵活的publish事件,同时又subscribe来监听,得到监听信息就改变客户端状态。这种方式客户端界面不用改变什么,也不用激活server-push。?
??? 这里的desktop不作为参数传递,使用Composer来监控客户端组件,如果有比较多信息需要实时的传递,比如聊天的项目,当a用户在聊天室里面发言, 其他的用户接受到a用户留言信息并显示,?可以使用EventQueues来发布(publish)a用户发言的事件,而其他用户则监听(subscribe)此事件,事件触发时并显示其a用户留言。
????
???ZK框架的灵活是很不错的!
?? 以上是我对ZK框架server-push的一点总结。有不对的地方,欢迎大家指正。
??