前端extjs、in.js、jquery,后端:vertx
服务端代码:
Verticle里的Start方法里
// 监测内存total大小、free大小,一秒发生一个消息 vertx.setPeriodic(1000, new Handler<Long>() { // 监听系统资源情况 @Override public void handle(Long event) { JsonObject message = new JsonObject(); message.putString("free", String.valueOf(Runtime.getRuntime().freeMemory() / 1024 / 1024)); message.putString("total", String.valueOf(Runtime.getRuntime().totalMemory() / 1024 / 1024)); vertx.eventBus().publish("hd.core.server.info", message); } });
前端main.js片段:
var cv = { message_services: {}, translateEvent: function(message) { if (message['acts'] && message['acts'].length > 0) { jQuery.each(message['acts'], function(i, msg) { // 消息类型,js服务注册、加载资源(同步、异步)渲染+数据、更新数据、初始化参数、消息里包含多个处理 // 执行消息:模版、数据、控制、业务DNA 表单的消息. act:,load_res,form,update_datas,char,,,,,,,,,,,,,,,,,,,, if (msg['act'] == 'service_reg') { //load_res,aaa var services = msg['services'].split(';'); $.each(services, function(i, ser) { try { var ss = ser.split(','); if (typeof eval(ss[1]) == 'function') { cv.message_services[ss[0]] = eval(ss[1]); } } catch (e) {} }); } if (msg['act'] == 'load_res') { var ress = new Array(); // 加载资源 jQuery.each(msg['resources'], function(i, res) { ress[i] = res['mod']; In.add(res['mod'], res); //In(res['mod'], function() {}); }); In.use.apply(this, ress); } if (cv.message_services[msg['act']] && typeof cv.message_services[msg['act']] == 'function') { // 把消息交给这个js函数处理 cv.message_services[msg['act']].apply(this, msg); } }); } }, doLogin: function() { // 如果没有连接,连接并发送登录消息 if (!cv['connect']) { In.add('sockjs', { path: 'js/util/sockjs-0.3.4.js', type: 'js',charset: 'utf-8' }); In.add('vertxbus', { path: 'js/util/vertxbus-2.1.js', type: 'js', charset: 'utf-8' }); In.add('jquery', { path: 'js/util/jquery-1.7.1.min.js', type: 'js', charset: 'utf-8' }); In('sockjs', 'vertxbus', 'jquery', function() { if (!cv['eb']) { cv['eb'] = new vertx.EventBus("/eventbus"); cv['eb'].onopen = function() { cv['connect'] = true; // 进行登录,发送登录消息 cv['eb'].send("hd.core", { "act": "login" }, function(msg, replyTo) { // 消息分发 cv.translateEvent(msg); }); }; cv['eb'].onclose = function() { cv['eb'] = null; }; } }); } } }; // 资源按顺序加载 In.config('serial', true); In.ready(function() { cv.doLogin(); });
首先加载In.config方法,ready里调用cv.doLogin。
doLogin里加载sockjs、vertxbus、jquery,加载之后发送动作是login的消息,之后 进入消息监听状态。
然后调用了translateEvent,根据msg['act']的值进行消息分发。
这里只做了个例子,根据监听“hd.core.server.info”频道的消息,用extjs的xtype: 'chart'控件展示服务器内存状态的编号。
其实这里可以做很多内容,例如:加载用户菜单、首页、实时的消息推送、聊天、甚至分布式计算都可以考虑考虑。
感兴趣的朋友可以到下面的地址获取代码。
源码:https://github.com/zhhzhfya/vx_platform