在几乎所有的业务系统或互联网应用中,预警系统几乎到处可见,预警系统主要分成2大模块:
- 预警系统条件的设置,可以基于Cron表达式或其他;
- 预警条件的提醒,可以是一个弹出窗,或者是后台自动发送一封邮件等;
预警条件的设置可以基于quartz开源框架,或者通过一个线程每隔N秒定时扫描,预警系统的难点在于在Web应用领域,后台触发的预警条件如何通知前台,因为Web是基于短连接的,实现思路可分为两大类,一类是实时的,一类是非实时的,本文主要实现基于Ice的实时预警提醒。
想要实现基于Ice的实时提醒,分以下步骤:
- 编写基于Applet的subscribe,让每个客户端订阅系统的预警主题;
- 每个subscribe收到预警提醒时,过滤非本文的预警提醒;
- 根据预警提醒设置,进行预警提醒;
这里使用的是发布—订阅模式,主要利用IceStorm,要使用IceStrom,必须启动IceBox,主要的技术点:
在JSP页面中嵌入Applet,并允许Applet中调用js函数,类似的代码如下:
<jsp:plugin archive="Ice.jar" code="youClass " width="20" height="20" codebase="yourCodeBase" type="applet">
<jsp:params>
<jsp:param value="true" name="mayscript"/>
</jsp:params>
</jsp:plugin>
编写基于Ice的发布主题Slice代码:
interface PubScriAction { void publishAlarm(ProductL2AlarmBean alarmbean); void publishTopic(string content); };
服务端向客户端发布主题调用代码:
Publisher app = new Publisher();
app.publishTopic("gjk_subscribe", String.valueOf(Math.random()));
app.getCommunicator().destroy();
Applet中订阅某个主题:
SubscriberNoArg app = new SubscriberNoArg(null);
app.subscribe("yourTopicName");
Applet中调用页面的js函数:
window = JSObject.getWindow(this);
window.call("exeOnsubscribeTopic", new Object[] {topic,"[applet]:"+str});
这里有一个Demo,展现了服务端发布一个主题时,客户端实时收到的效果: