JAVA编写的预警系统

预警系统

<!-- start content -->

目录

[隐藏]
<script></script>

系统综述

       该系统主要是对卓博公司网站的相关子系统包括服务器、数据库等进行监控和扫描,以便及时发现问题并通过短信或邮件或CTI的方式发送给相关子系统的负责人。

       预警系统主要采取开源框架Quartz和Logback。采用Quartz来实现各个子任务的时间调度。LogBack主要用来作为日志记录功能。有关于Quartz和LogBack的学习文档的学习,可以自己GOOGLE一下。

 

 

系统主要结构

        该系统通过监听类AppClient.java来监控主程序Client.java的调用。Client.java再调用总任务调度程序AlarmClient.java来读取各种子配置文件,并负责调度所有子任务的执行。

        监听程序AppClient每隔10秒钟监听Client的状态,主要是通过读取alarm-config.xml中的reload字段信息,如果该字段是true表示需要重新启动Client程序,如果为false则不需要重新启动该程序,并继续监听。Client程序每隔半个小时重新加载AlarmClient主调程序【也可以在程序中另外指定】,重新加载AlarmClient程序后,所有子功能模块将重新加载启动。

结构图:

      
Alarm.JPG

源程序结构:

        alarminterface

        ------AlarmBean.java (所有子程序Bean类的父类,子程序都要配置一个BEAN类,继承该类)

        ------AlarmStrategy.java (所有子任务程序都要实现该类,通过实现该类,子程序才能作为一个任务被加载)

       backupsubsystem(该包放置所有子功能模块代码)

       client(客户端)

       ------AlarmClient.java (所有子任务程序的组装类。负责组装所有的任务。)

       ------AppClient.java (Client.java的监听类。)

       ------Client.java (调用AlarmClient的类,每隔半小时重新加载AlarmClient。)

       ------ClientReloadListening.java (AppClient监听Client的监听类。该类负责调用Client。)

       com.util(预警系统所使用的工具包)

       joblistener

        ------AlarmJobDetailListening.java (子任务JobDetail的监听类,主要监听每个子任务启动和结束。)

        ------AlarmJobListening.java (子任务Job的监听类,主要监听每个子任务启动和结束。) 

        ------AlarmTriggerListening.java (子任务Trigger的监听类。)

        logsystem

        ------log

        ----------Logger.java (打印日志记录的接口。) 

        ----------LoggerBean.java (各子模块配置文件中,日志配置文件节点中的所有值都将填充到该BEAN中。)

        ----------LoggerFactory.java (获取日志Logger实例工厂。) 

        ----------LogImpl.java (日志记录功能的实现类。所有子功能中的日志记录功能都是通过该类来实现。) 

        ------logconsole(控制台打印日志实现类。)

        ------logcti(CTI发送日志实现类。)

        ------logdb(数据库记录日志实现类。)

        ------logfile(控文件记录日志实现类。)

        ------logmail(邮件发送日志实现类。)

        ------logsms(短信发送日志实现类。)

        ------loginterface(所有日志实现类的接口。可以扩展该接口来实现自己的日志记录类。)

        sendinterface

         ------cti(cti发送方式实现类。)

         ------mail(邮件发送实现类。)

         ------sms(短信发送实现类。)

子功能实现DEMO

      该功能主要实现一个简单的打印功能,通过控制台、CTI、短信、邮件等方式来告知相关人员打印信息。并制定每隔5秒钟执行一次程序。

1.子程序配置文件:/conf/Test.xml

<?xml version="1.0" encoding="gbk" ?>
<conf>
  <bean class="backupsubsystem.testclient.TestBean"></bean><!--子程序的BEAN类-->
  <action class="backupsubsystem.testclient.Test"><!--子程序的java文件-->
        <job>
            <cronExp><![CDATA[0/5 * * * * ?]]></cronExp><!--任务执行周期-->
            <deleteJob><![CDATA[false]]></deleteJob><!--是否删除该任务-->
       </job>
  </action>
  <!-- 显示方式 -->
  <!-- 控制台记录方式 -->
  <appender name="TestConsole" class="logsystem.logconsole.ConsoleAppender">
  </appender>
   <!-- 用邮件的方式发送 -->
  <appender name="TestEMAIL" class="logsystem.logmail.MailAppender">
    <mailHost>192.168.60.131</mailHost>
    <mailUser>JCNEP3160</mailUser>
    <mailPwd>820815</mailPwd>
    <mailFrom>tuping@jobcn.com</mailFrom>
    <mailTo>tuping@jobcn.com</mailTo>
    <mailSubject>测试主题</mailSubject>
  </appender>
  <!-- CTI方式 -->
  <appender name="TestCti" class="logsystem.logcti.CtiAppender">
    <ctiTo>JCNEP3160</ctiTo>
  </appender>
  <!-- SMS方式 -->
  <appender name="TestSms" class="logsystem.logsms.SmsAppender">
    <phone>15818375674</phone>
  </appender>
  
    <trace>
      <appender-ref>TestConsole</appender-ref>

      <appender-ref>TestSms</appender-ref>
     <appender-ref>TestEmail</appender-ref>

     <appender-ref>TestCti</appender-ref>

   </trace>
  </conf>

2.将该配置文件路径配置到alarm-config.xml中。例如:

<include file="conf\\Test.xml"/>

3.子程序JAVA文件:

package backupsubsystem.testclient;

public class Test extends AlarmStrategy {

 /*

  • 子功能模块需要继承AlarmStrategy ,才能把自己发布成一个任务,必须实现 public void execute(JobExecutionContext jobCtx) throws JobExecutionException 方法。
  • /
     public Test(){}
     /*
  • execute方法传入JobExecutionContext 参数,可以通过该实例得到子程序所配置的bean类。
  • /
     public void execute(JobExecutionContext jobCtx) throws JobExecutionException {

 
  this.jobDetail =jobCtx.getJobDetail();  
  this.dataMap = jobDetail.getJobDataMap();  
  this.bean = getBean(dataMap);

 //通过得到的这个BEAN,就可以得到你配置文件action节点下的属性值。
  TestBean testbean = (TestBean) this.bean;

 //trace方法传入的是一个object数据,第一个参数必须传入该bean类的document属性。第二个参数是日志记录内容。
  log.trace(new Object[]{this.bean.getDoc(),"进入TRACE方法"});
 }
 
}
这样一个监控程序就部署好了。执行结果:该程序每隔5秒执行一次,并且将JAVA文件中所要记录的“进入TRACE方法”内容通过控制台、CTI、邮件、短信方式通知给相关人员。

 配置文件说明

系统采取配置的方式,来集成各个子系统。

系统主配置文件(conf/alarm-config.xml):[各节点命名按照javaBean的属性规范命名,例如:conDriver,否则会取不到值。系统采用的是反射的方式来给BEAN类赋值。除了<reload>字段是必须字段其他的都是非必须字段,配置的原因主要是为了设置各个子类BEAN的默认值]

<?xml version="1.0" encoding="UTF-8" ?>
      <conf>

            <!--下面配置文件是某个子项目配置文件地址-->
           <include file="conf\\jobcn_cti_snapshot_backup.xml"/>
    </conf>

<?xml version="1.0" encoding="UTF-8" ?>
<conf>
       <action>
        <database>
            <conDriver>com.microsoft.jdbc.sqlserver.SQLServerDriver</conDriver>><!--数据库的驱动-->
            <conUrl>jdbc:sqlserver://192.168.60.214:1433;DatabaseName=jobcn_cti_snapshot</conUrl>><!--数据库的URL地址-->
            <conUser>JCNEPxxxx</conUser><!--数据库连接用户名-->
            <conPwd>abc</conPwd><!--数据库连接密码-->
        </database>
        <im>
            <mail>
                     <mailHost>192.168.60.131</mailHost><!--邮件服务器地址-->
                     <mailUser>JCNEPxxx</mailUser><!--连接邮件用户名-->
                     <mailPwd>xxx</mailPwd><!--连接邮件用户密码-->
                     <mailFrom>a@jobcn.com</mailFrom><!--邮件发送人-->
                     <mailTo>a@jobcn.com</mailTo> <!--邮件目标发送人(格式:a@jobcn.com,b@jobcn.com)-->
            </mail>
            <cti>
                    <ctiTo>JCNEPxxx</ctiTo><!--cti目标发送人(格式:JCNEPxxxx,JCNEPxxxx)-->
            </cti>
            <sms>
                   <phone>158xxxxxxxx</phone><!--短信目标发送人(格式:158xxxxxxxx,133xxxxxxxx)-->
            </sms>
        </im>
        <job>
                  <cronExp>0/10 * * * * ?</cronExp> <!--任务执行周期 详细见后文注释-->
                  <deleteJob>true</deleteJob> <!-- 是否删除该任务(FALSE:每次加载主程序的时候加载该任务;TRUE:主程序加载的时候不加载该任务;PAUSE:暂停该任务) -->
        </job>
        <path>
            <logPath>\\errorlog\\Jobcn_Cti_SnapShot_TelLog2\\</logPath> <!-- 即时消息发送文件地址 -->
            <!-- 即时消息发送日志文件地址 -->
            <smsPath>\\imlog\\SMS\\</smsPath>
            <ctiPath>\\imlog\\CTI\\</ctiPath>
            <mailPath>\\imlog\\MAIL\\</mailPath>
        </path>

        <reload>false</reload><!--AppClient.java每个10秒来监听该字段-->
    </action>
</conf>

子功能模块配置文件(jobcn_cti_snapshot_backup.xml):【每一个子功能模块都需要有一个配置文件】

<?xml version="1.0" encoding="gbk" ?>
<conf>
  <bean class="backupsubsystem.testclient.TestBean"></bean><!--该子功能模块的BEAN文件,主要用来获得该配置文件中action节点下的属性值-->
  <action class="backupsubsystem.testclient.Test"><!--子功能模块文件【action下的节点值必须按照javabean的命名规范来命名,并且每一个节点都要在你所配置的bean中要有相应的属性对应。该节点中只有cronExp和deleteJob节点是必须的节点,其他为非必须节点,如果没有配置bean class=""那么系统默认提供AlarmBean来作为该子功能模块的bean类】-->
    <database>
      <conDriver>com.microsoft.jdbc.sqlserver.SQLServerDriver</conDriver>
      <conUrl>jdbc:sqlserver://192.168.60.214:1433;DatabaseName=jobcn_cti_snapshot</conUrl>
      <conUser>JCNEP3160</conUser>
      <conPwd>JCNEP3160abc</conPwd>
    </database>
    <job>
      <cronExp><![CDATA[0/15 * * * * ?]]></cronExp><!--该任务执行时间周期-->
      <deleteJob><![CDATA[false]]></deleteJob><!--是否删除或暂停该任务,false表示不删除,true表示删除,pause表示暂停该任务。系统将在执行完一个周期后重新加载。或更改alarm-config.xml中的reload节点为true就会立即加载。-->
    </job>
    <path>
      <logPath>\\errorlog\\Test\\</logPath>
      <smsLogPath>\\imlog\\SMS\\</smsLogPath>
      <ctiLogPath>\\imlog\\CTI\\</ctiLogPath>
      <mailLogPath>\\imlog\\MAIL\\</mailLogPath>
    </path>
  </action>
  <!-- 显示方式 -->
  <!-- 控制台记录方式 -->

 <!--

    系统中提供了控制台打印方式,文件记录方式,邮件方式,CTI方式,短信方式和数据库方式分别来保存子程序所要进行的日志记录信息。

   控制台实现方式类:logsystem.logconsole.ConsoleAppender

   文件实现方式类:logsystem.logfile.FileAppender

   邮件实现方式类:logsystem.logmail.MailAppender

   CTI实现方式类:logsystem.logcti.CtiAppender

   短信方式实现类:logsystem.logsms.SmsAppender

   数据库实现方式类:logsystem.logdb.DBAppender

-->
  <appender name="TestConsole" class="logsystem.logconsole.ConsoleAppender">
  </appender>
 
  <!-- 文件记录方式 -->
  <appender name="TestFile" class="logsystem.logfile.FileAppender">
    <logPath>\\errorlog\\cticlient\\AAAAAAA\\</logPath>
  </appender>
 

  <!-- 用邮件的方式发送 -->
  <appender name="TestEMAIL" class="logsystem.logmail.MailAppender">
    <mailHost>192.168.60.131</mailHost>
    <mailUser>JCNEP3160</mailUser>
    <mailPwd>820815</mailPwd>
    <mailFrom>tuping@jobcn.com</mailFrom>
    <mailTo>tuping@jobcn.com</mailTo>
    <mailSubject>测试主题</mailSubject>
  </appender>
 
  <!-- CTI方式 -->
  <appender name="TestCti" class="logsystem.logcti.CtiAppender">
    <ctiTo>JCNEP3160</ctiTo>
  </appender>
 
  <!-- SMS方式 -->
  <appender name="TestSms" class="logsystem.logsms.SmsAppender">
    <phone>15818375674</phone>
  </appender>
 
  <!-- 数据库方式 -->
  <appender name="TestDB" class="logsystem.logdb.DBAppender">
    <conDriver>com.mysql.jdbc.Driver</conDriver>
    <conUrl>jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf-8</conUrl>
    <conUser>root</conUser>
    <conPwd>root</conPwd>
    <tableName>Test</tableName><!--日志记录所要插入的表,表结构只有两个字段,一个是ID(主键,自增长),一个是content字段(保存日志记录)-->
  </appender>

 

  <!--

      配置打印接口节点分别有debug,trace,info,warn,error五个级别。

      每个级别可以自行配置所采用的日志记录方式。例如:

      采用trace的打印方式,想配置控制台打印和邮件打印的日志记录方式:

       <trace>
          <appender-ref>TestConsole</appender-ref>

          <appender-ref>TestEMAIL</appender-ref>
       </trace>

-->
  <trace>
    <appender-ref>TestConsole</appender-ref>
  </trace>
  <info>
    <appender-ref>TestConsole</appender-ref>
  </info>
</conf>

日志记录功能

系统提供5种日志记录方式:debug,trace,info,warn,error他们之间没有级别之分,是并行的几种方式。

用法是在各子功能JAVA文件中调用例如:[以trace方法为例]

log.trace(new Object[]{});

trace方法的具体实现:

public void trace(Object[] obj) {
   try {
   Document document = (Document) obj[0];
   String content = (String) obj[1];
   doAppender(document,content,"trace");
  } catch (Exception e) {
   e.printStackTrace();
   PrintUtil.printConsole("执行trace方法出错!");
  }
 }

该方法传入的是一个数组,数组的第一个参数子配置文件所配置的Bean类所得到的document.第二个数组元素是所要记录的日志信息。

在配置文件中的调用方式:

<trace>
    <appender-ref>TestConsole</appender-ref>
  </trace>

appender-ref会在同一配置文件中找到appender的name值等于TestConsole的的配置文件信息并加载该appender的实现类进行日志的输出。

例如:

<!-- 控制台记录方式 -->
  <appender name="TestConsole" class="logsystem.logconsole.ConsoleAppender">
  </appender>

可以配置一个或多个日志输出方式,例如:

<trace>
    <appender-ref>A</appender-ref>

   <appender-ref>B</appender-ref>
  </trace>

通过log.trace方式打印的日志就会通过A方法和B方法的方式输出。【前提:必须在配置文件中配置A和B的Appender】

 

系统中默认提供的appender日志记录类都必须实现的接口:

public interface AppenderBase {
 
 void doAppend();

}

 

我们可以使用已经提供的Append实现类,在上文中有提过。也可以自己实现该接口,来配置自己的Append类。

系统中默认提供的Append实现类:

ConsoleAppender:将日志打印到控制台中输出;

CtiAppender:将日志通过CTI发送输出;

DBAppender:将日志通过制定数据库输出:

FileAppender:将日志通过制定文件输出:

MailAppender:将日志通过邮件输出;

SmsAppender:将日志通过短信输出。

下文以MailAppender为例:

MailAppender

   可以通过配置该类,从而将日志信息打印输出到控制台上

例如:

package logsystem.logconsole;

import logsystem.log.LoggerBean;
import logsystem.loginterface.AppenderBase;

import com.util.PrintUtil;

public class MailAppender implements AppenderBase {

 public LoggerBean bean;
 public MailAppender(){}
 

/*自己实现的Append类,必须主动提供带有LoggerBean的构造函数,用来获得你所配置文件中append子节点的值.

例如:

<appender name="TestEMAIL" class="logsystem.logmail.MailAppender">
    <mailHost>192.168.60.131</mailHost>
    <mailUser>JCNEP3160</mailUser>
    <mailPwd>820815</mailPwd>
    <mailFrom>tuping@jobcn.com</mailFrom>
    <mailTo>tuping@jobcn.com</mailTo>
    <mailSubject>测试主题</mailSubject>
  </appender>

通过传入的LoggerBean,可以通过bean.getMailHost()来得到192.168.60.131的值。

  • /
     public MailAppender(LoggerBean bean)
     {
      this.bean = bean;
     }
     
     public void doAppend() {
      MailUtil.sendMail(bean.getMailHost(),bean.getMailUser(),bean.getMailPwd(),bean.getMailFrom(),bean.getMailTo(),bean.getMailSubject(),bean.getContent());
     }

}

后台管理功能 

1.后台管理主页面

Alarm1.jpg

 

2.菜单功能介绍

2.1 系统任务列表:主要显示的是当前正在运行的任务队列。

Alarm2.jpg

2.1.1 重新启动系统:该功能可以重新启动预警系统,全部重新加载所有任务。
2.1.2 修改:该功能可以对修改某个单独任务的配置文件进行修改。
2.2 系统任务配置文件:主要列出所有任务的配置文件信息。

Alarm3.jpg

 

2.3 系统执行日志:主要列出系统在运行过程中控制台的打印信息。

Alarm4.jpg

 

2.4 系统异常任务日志:系统会对所有的任务进行监控,如果任务出现异常,将可以在该目录中列出。
2.5 系统信息发送日志:子功能模块调用系统的IM发送接口,系统将对所有发送的内容保存在数据库中,并在该目录中列出。

子系统主要功能模块 

序号  子项目类名  功能描述  子项目负责人  预警通知采取方式  负责人联系方式 备注
1         
2        
3        


 

 附录 

任务执行周期表达式:

Cron表达式时间字段

 

位置

时间域名

允许值

允许的特殊字符

1

0-59

, - * /

2

分钟

0-59

, - * /

3

小时

0-23

, - * /

4

日期

1-31

, - * ? / L W C

5

月份

1-12

, - * /

6

星期

1-7

, - * ? / L C #

7

年(可选)

空值1970-2099

, - * /



Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

表2下面给出一些完整的Cron表示式的实例:

[[|]]2 Cron表示式示例

注释:"0 0/20 * * * ?" 表示的是每20分钟执行一次,也就是每个小时的0分,20分,40分开始执行。

 

 

表示式

说明

"0 0/20 * * * ?"  每20分钟执行一次
"0 0 * * * ?"  每小时执行一次

"0 0 12 * * ? "

每天12点运行

"0 15 10 ? * *"

每天10:15运行

"0 15 10 * * ?"

每天10:15运行

"0 15 10 * * ? *"

每天10:15运行

"0 15 10 * * ? 2008"

在2008年的每天10:15运行

"0 * 14 * * ?"

每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。

"0 0/5 14 * * ?"

每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。

"0 0/5 14,18 * * ?"

每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。

"0 0-5 14 * * ?"

每天14:00点到14:05,每分钟运行一次。

"0 10,44 14 ? 3 WED"

3月每周三的14:10分到14:44,每分钟运行一次。

"0 15 10 ? * MON-FRI"

每周一,二,三,四,五的10:15分运行。

"0 15 10 15 * ?"

每月15日10:15分运行。

"0 15 10 L * ?"

每月最后一天10:15分运行。

"0 15 10 ? * 6L"

每月最后一个星期五10:15分运行。

"0 15 10 ? * 6L 2007-2009"

在2007,2008,2009年每个月的最后一个星期五的10:15分运行。

"0 15 10 ? * 6#3"

每月第三个星期五的10:15分运行。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值