- 浏览: 452974 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
a464697691:
楼主厉害,现在可以使用了
Proxool houseKeepingSleepTime bug修正 -
chenpi529:
楼主好牛逼
Proxool houseKeepingSleepTime bug修正 -
huangxinyu_it:
多谢楼主了
Proxool houseKeepingSleepTime bug修正 -
kokorodo:
谢谢了!
zk中文开发手册pdf版(基于3.5.1) -
superscorpio:
public void testImportInContex ...
MVEL2.0控制流
所用到的资源 见附件
log4j.properties
log4j-1.2.15.jar
slf4j-log4j12-1.5.0.jar
slf4j-api-1.5.0.jar
commons-lang-2.4.jar
一,zk内存监控要点:
Monitor接口是zk提供的zk Engine监听工具, 如果在zk.xml有该配置,zk将在桌面的创建销毁,会话的创建销毁,
以及异步更新时回调相关方法,从而可以统计会话,桌面,更新的数量等等
大致流程:实现该Monitor,的异步更新方法 -> 配置zk.xml中的monitor监听器以及log4j日志项
->添加zul视图,以及视图控制器 -> 测试
二,memory Monitor的的实现
1,Monitor的空实现,方便继承,不必关心不感兴趣的方法
package org.zkway.util.zk; import java.util.List; import org.zkoss.zk.ui.Desktop; import org.zkoss.zk.ui.Session; import org.zkoss.zk.ui.util.Monitor; /** * 该类仅仅提供Monitor的空实现 * * <p> * Monitor类是zk提供的zk Engine监听工具, 通常用于统计会话,桌面,更新的数量 * * @author sunflower * */ abstract public class AbstractMonitor implements Monitor { /** * 当异步更新之后调用 * <p> * 所谓的更新,其实可以理解为一个异步事件请求, 并不是所有的事件请求都会更新客户端视图, 只是在需要时才修改 */ @Override public void afterUpdate(Desktop desktop) { } /** * 当异步更新之前调用 * <p> * 所谓的更新,其实可以理解为一个异步事件请求, 并不是所有的事件请求都会更新客户端视图, 只是在需要时才修改 */ @Override public void beforeUpdate(Desktop desktop, List requests) { } /** * 当创建新 桌面 的时候调用 * */ @Override public void desktopCreated(Desktop desktop) { } /** * 当桌面销毁时创建 */ @Override public void desktopDestroyed(Desktop desktop) { } /** * 当创建新的session时调用 */ @Override public void sessionCreated(Session sess) { } /** * 当session销毁时调用 */ @Override public void sessionDestroyed(Session sess) { } }
2,memory Monitor的的实现
package org.zkway.util.zk; import java.util.List; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zkoss.zk.au.AuRequest; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Desktop; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.IdSpace; import org.zkoss.zk.ui.sys.ExecutionCtrl; /** * Zkway内存变化统计 * <p> * 仅监视客户操作的内存变化情况 * * @author sunflower * */ public class ZkwayMemoryStatistic extends AbstractMonitor { static Logger log = LoggerFactory.getLogger(ZkwayMemoryStatistic.class); /** * 常量标识符,标识当前请求作用域内beforeUpdate时的内存大小 */ private static final String REQUEST_MEMORY = "org.zkway.zk.constants.requestMemory"; @Override public synchronized void beforeUpdate(Desktop desktop, List requests) { ExecutionCtrl ec = (ExecutionCtrl) Executions.getCurrent(); List<AuRequest> reqs = (List<AuRequest>) requests; long memory = Runtime.getRuntime().freeMemory(); Executions.getCurrent().setAttribute(REQUEST_MEMORY, memory); for (AuRequest auq : reqs) { auq.activate(); // 激活request,给AuRequest component和page属性赋值,方便下面使用 log.debug("【beforeUpdate】[{}] \tmemory [{}] kb \t{}({}) \tcmd [{}] \tPage [{}]", new Object[] { Executions.getCurrent().getRemoteAddr(), memory / 1024, auq.getComponent().getDefinition() .getName(), auq.getComponent().getId(), auq.getCommand(), getCompPath(auq.getComponent()) }); } } /** * 获得组件的路径 * * @param comp * zk组件 * @return 组件的路径 */ private String getCompPath(Component comp) { StringBuilder sb = new StringBuilder(); Component current = comp; while (current != null) { if ((current instanceof IdSpace) && StringUtils.isNotBlank(current.getId())) { sb.append(" -> ").append(current.getDefinition().getName()) .append("(").append(current.getId()).append(")"); } else { sb.append(" -> ").append(current.getDefinition().getName()); } current = current.getParent(); } sb.append(" ->文件").append(comp.getPage().getRequestPath()); return sb.toString(); } @Override public synchronized void afterUpdate(Desktop desktop) { ExecutionCtrl ec = (ExecutionCtrl) Executions.getCurrent(); long memory = (Long) Executions.getCurrent().getAttribute( REQUEST_MEMORY); long m = memory - Runtime.getRuntime().freeMemory(); memory = memory - m; log .debug( "【afterUpdate 】[{}] \tmemory [{}] kb \tdecrease [{}] kb \tPage [{}] ", new Object[] {Executions.getCurrent().getRemoteAddr(), memory / 1024, m / 1024, ec.getCurrentPage().getRequestPath() }); } }
二,配置zk.xml,添加monitor监听器
<!-- Optional -->
<!-- the following listener is used to see # of sessions, desktops... --> <listener> <description>[Optional] Mointor the statistic</description> <listener-class> org.zkway.util.zk.ZkwayMemoryStatistic</listener-class> </listener>
三,添加视图页面,控制器,测试
<window id="indexWin" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:n="http://www.zkoss.org/2005/zk/native" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:ca="http://www.zkoss.org/2005/zk/client/attribute" apply="org.zkway.ctrl.IndexController"> <!-- borderlayout如果有父节点,那么必须设置height属性,否则不显示 --> <borderlayout height="1800px"> <!-- 北(上) --> <north height="100px" style="background-image:url(images/bg.png);"> <div> <button forward="onTestMemory" id="btnTestMemory" label="test memory" /> </div> </north>
import java.util.HashMap; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.util.GenericComposer; public class IndexController extends GenericComposer { private static final long serialVersionUID = -3801962286418473844L; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); } public void onTestMemory() { for (int i = 0; i < 1000; i++) new HashMap(100); } }
监控记录
【beforeUpdate】[127.0.0.1] memory [7105] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]
【afterUpdate 】[127.0.0.1] memory [7098] kb decrease [7] kb Page [//WEB-INF/content/index.zul]
【beforeUpdate】[127.0.0.1] memory [7052] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]
【afterUpdate 】[127.0.0.1] memory [7045] kb decrease [6] kb Page [/WEB-INF/content/welcome.zul]
【beforeUpdate】[127.0.0.1] memory [7006] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]
【afterUpdate 】[127.0.0.1] memory [6999] kb decrease [6] kb Page [//WEB-INF/content/index.zul]
【beforeUpdate】[127.0.0.1] memory [6953] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]
【afterUpdate 】[127.0.0.1] memory [6946] kb decrease [7] kb Page [/WEB-INF/content/welcome.zul]
【beforeUpdate】[127.0.0.1] memory [8579] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]
【afterUpdate 】[127.0.0.1] memory [8568] kb decrease [10] kb Page [//WEB-INF/content/index.zul]
【beforeUpdate】[127.0.0.1] memory [8525] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]
【afterUpdate 】[127.0.0.1] memory [8520] kb decrease [5] kb Page [/WEB-INF/content/welcome.zul]
【beforeUpdate】[127.0.0.1] memory [8477] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> north -> borderlayout -> window(indexWin) ->文件//WEB-INF/content/index.zul]
【afterUpdate 】[127.0.0.1] memory [8471] kb decrease [6] kb Page [//WEB-INF/content/index.zul]
【beforeUpdate】[127.0.0.1] memory [8428] kb button(btnTestMemory) cmd [onClick] Page [ -> button -> div -> window(welcomeWin) ->文件/WEB-INF/content/welcome.zul]
【afterUpdate 】[127.0.0.1] memory [8422] kb decrease [5] kb Page [/WEB-INF/content/welcome.zul]
- 资源文件.rar (603.8 KB)
- 下载次数: 41
发表评论
-
zkspring 3.0RC bug 修复
2010-11-19 15:46 1807zkspring 3.0RC bug 修复 ... -
【zk开发】使用Sessions.getCurrent().invalidate()时需要特别注意到问题
2010-11-15 16:25 2409Sessions.getCurrent().invali ... -
【zk开发】use和apply的区别
2010-11-15 14:03 4504use 使用一个组件类,该类必须是当前组件 ... -
【zk开发】java代码给组件添加客户端事件处理javascript
2010-11-10 10:49 1794/** *设置或删除widget的事件监听器,如 ... -
【zk开发】zk中的表单验证(优化版)
2010-11-10 10:41 2353/** * 验证表单 * <p> ... -
【zk开发】ZkUtils 1.2
2010-11-08 10:22 2745ZkUtils 是zk开发中的一些工具方法集合,将散落在 ... -
ZK 5.0.5 chm api文档
2010-11-03 10:11 5811ZK 5.0.5 chm api文档 文档在附件 ... -
ZK 5.0.5正式版发布
2010-11-02 18:24 1154ZK 5.0.5正式版发布 更新日志http: ... -
【zk开发】理解zk事件处理线程
2010-11-01 17:27 2254什么是事件处理线程(EventProcessingTh ... -
【zk开发】zkstudio安装及使用视屏
2010-10-29 16:58 2175安装视屏 http://docs.zkoss ... -
zk5.0.5可能最近两天发布
2010-10-29 13:13 1056zk5.0.5可能最近两天发布 zk5.0 ... -
【zk开发】zk注解的秘密
2010-10-28 14:26 3952The DataBinder that rea ... -
【zk开发】如何在页面中获得composer对象
2010-10-15 15:31 2605样例: <window id=&qu ... -
【zk开发】jQuery+zk完美客户端
2010-09-14 11:11 2548(function(window) { var lin ... -
【zk开发】zk5.0.4 datebox inplace模式的bug
2010-09-08 16:24 1587zk5.0.4 datebox inplace模式 ... -
使用ZK CE版开发商业软件
2010-09-07 15:50 2444仔细读一下内容 LGPL(GNU Lesser Gene ... -
【zk开发】zk的国际化
2010-09-02 16:22 3795【zk开发】zk的国际化 一,准备资源文件 ... -
zk5.0.4 chm版API
2010-09-01 12:37 1240zk5.0.4 chm版API -
挥起马鞭,升到zk5.0.4
2010-08-31 23:22 1387由于zk5.0.4测试版已发布公开测试,正式版应该很快出 ... -
ZK 5.0.4新特性
2010-08-31 16:38 3830ZK 5.0.4新特性 New Feature ...
相关推荐
5、精美的而快速的界面处理技术、最少内存使用、让用户可以开发精美工控画面而实现高效工控软件。 6、作为软硬件生产商、软硬件完美结合、雄厚的技术实力、让用户只专注于工控系统而不是软件本身。 7、内置数据...
Mycat关键特性 关键特性 支持SQL92标准 ...支持zookeeper协调主从切换、zk序列、配置zk化(1.6) 支持库内分表(1.6) 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...