平台简单介绍:
是一个监控平台,做一些定时任务监控、主机批处理运行监控、主机实时交易信息监控以及主机监控等等。后台抽数部分是用C实现的,前端展示、分析、报警等用J2EE实现。而我正是负责J2EE这一块的设计和实现。
这里简单记录了当时所做声音报警功能设计和实现以及如何分析等等。
这里使用定时任务的监控来分析:
1. 声音报警程序功能要求
说明:监控表(watch_task,也就是定时任务结果表),当有定时任务执行失败时,前端页面给出声音报警提示。当然后台也直接发短信到相应的处理人员手机中。
2. 后台扫描监控表可选实现方案
(1) 使用socket与主机通讯。当有失败记录进入watch_task表时,服务主机发给程序服务器一个信息,收到信息后作出简单的处理以及声音报警。
(2) 使用线程实时扫描watch_task表,当又失败记录进入时,前端页面做相应处理且给出声音警告。
(3) 使用struts2拦截器定时扫描表,当又失败记录进入时,前端页面做相应处理且给出声音警告。说明:需要通过页面自动刷新(激活action)时,才扫描。需要注意的是,本来系统session控制也是通过struts2拦截器实现的,拦截时得有个先后顺序。
(4) 使用ServletContextListener结合TimerTask定时扫描表,前端页面做相应处理且给出声音警告。
最后选择:根据个人因素以及能力侧重点考虑,使用第4个方案。在web.xml配置该监听器,应用服务器启动时开始监听,一分钟扫描一次监控表。
3. 实现机制
我的实现有些老土,让各位道友笑话了。是这样的:
设计一张对照表warn_compare,表结构如下:
字段 | 数据类型 | 注释 | 意义 |
Data_type | Char(1) | 数据类型 | 主键,0-定时任务监控 1-批处理运行监控…… |
Count0 | Integer | 计数 | 用于记录到上一次扫描为止时,所有的失败且未处理记录数 |
TimerTask定时扫描:这里的作用只是1分钟扫描一次watch_task表以及更新warn_compare表。即:当扫描到在监控表中有新的失败记录时,更新warn_compare表对应的count0字段的值。前端声音报警页面(页面设计后面详细写出)所在的frame通过每隔1分钟自动刷新一次。warnFrame在页面写法:
<framenoresize="noresize" target="contents"id="warnFrame" name="warnFrame" src="<%=path%>/warnSoundAction!conpareWarnCount.action"scrolling="no"/>。每刷新一次,后台对比一次的监控表失败且未处理总数和对照表相应值,当前者大于后者时,说明有新的失败记录进入监控表,这时警告页面就发出警告声音。
这里看不是很明白的道友可以先看后面的前端设计部分,再回头看就能看明白。
4. 前端声音告警程序设计
(1) 需要考虑的问题:
l 如何在页面加入声音播放。
l 当监控表有新的失败记录进来时,如何自动播放声音告警。
l 某个时刻,需要告警时,在线监控业务员都收到告警。当有还没有处理的任务时,用户登录后给出告警。
l 不管用户当前所在哪个页面,当有需要告警时,都会播放告警声音。
(2) 播放声音方案选择
l jsp页面嵌入声音,使用<bgsound>播放背景音乐,貌似做不到我们的要求;
l 使用Awt/Swing播放声音?若是服务器报警可以,当时客户端报警似乎不现实。
l 使用applet播放声音告警,applet依赖于客户端来展示效果。可内嵌于html、jsp等等。--可做优先考虑
l 另外在api中可发现javax目录下也提供了一个sound包对java声音的强大支持,并且在sun网站的jjse上可下载到相关的大量例子程序.有志于声音处理方向的朋友可下载试试。
l 最后我的选择是3.值得说明的是,java好像只支持.au声音文件。想测试的朋友可做个测试。当然我项目比较急,没有测过。这里我直接使用.au格式文件。
(3) 页面设计
首先平台主页面框架是用frameset实现的:
<frameset rows="120,*,1"framespacing="0"border="0"frameborder="0">
<framenoresize="noresize"target="contents"id="menuFrame"name="menuFrame"src="newmenu.jsp"scrolling="no"/>
<frame noresize="noresize"id="mainFrame"name="mainFrame"src="<%=path %>/waitDealAction!getData.action"scrolling="yes" />
<frame noresize="noresize"target="contents"id="warnFrame"name="warnFrame"src="<%=path %>/warnSoundAction!conpareWarnCount.action"scrolling="no"/>
</frameset>
说明:估计有些道友应该都可以看出来了。
120--用户显示菜单导航以及个人登录信息等部分。
*--工作区。
1--包含的是声音报警页面/或空白页面。这个页面占的比例非常小,相当于是隐藏起来的。当对比出来有新失败记录进入监控表时,转到声音告警页面。反之则转到空白页面。这两个页面设计成每个30s刷新一次的父页面中的warnFrame部分。
声音页面部分写法:
<scripttype="text/javascript">
//调用父页面的sound方法。用于弹出告警对话框
window.top.sound();
//每隔1分钟刷新一次父页面的warnFrame,刷新间隔时间最好和TimerTask扫描时间一样,不宜太短,避免出现重复告警。
function preload(){
window.parent.frames.warnFrame.location.reload();
}
setTimeout('preload()',60000);
</script>
父页面(main.jsp)中function sound()写法:
<scripttype="text/javascript">
function sound(){
$.dialog({
id: 'msg',
title:'警告窗口',
content:'url:sound/SoundDemo.jsp',
width:200,
height:100,
left:'100%',
top:'100%',
fixed:true,
drag:false,
resize:false,
init: function() {
var that = this, i =20;
var fn = function() {
that.title(i + '秒后关闭');
!i && that.close();
i --;
};
timer = setInterval(fn, 1000);
fn();
},
close:function () {
clearInterval(timer);
}
});
}
</script>
注:这里我用到jquery弹出框插件lhgdialog。效果挺好看的,但是文件稍大,会影响系统反应。但是我这个页面负荷量很小不影响,如交易类系统不建议使用。
效果图:在页面右下角弹出提示20秒后自动关闭。
弹出的这个警告窗口包含的就是声音警告页面,该页面嵌入applet小应用程序。这里我设置applet的width和height都为0px。
到这里声音告警模块已经做得差不多了。剩下的还有要不要做个applet的数字证书签名等方便资源访问。
各位道友看完,或看了部分就看不下去。可吐、可喷、可扔砖头。但是我最希望有道友给更好的修炼建议。