JAVA编写的预警系统

预警系统

目录

[隐藏]
  • 1 系统综述
  • 2 系统主要结构
  • 3 子功能实现DEMO
  • 4 配置文件说明
  • 5 日志记录功能
  • 6 后台管理功能 
  • 7 子系统主要功能模块 
  • 8 附录 

系统综述

       该系统主要是对卓博公司网站的相关子系统包括服务器、数据库等进行监控和扫描,以便及时发现问题并通过短信或邮件或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程序后,所有子功能模块将重新加载启动。

结构图:

      

源程序结构:

        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



 
 
       
           
           
      

  

 
 
 
 

   
 
    192.168.60.131
    JCNEP3160
    820815
    [email protected]
    [email protected]
    测试主题
 

 
 
    JCNEP3160
 

 
 
    15818375674
 

  
   
      TestConsole

      TestSms
     TestEmail

     TestCti

  
 

2.将该配置文件路径配置到alarm-config.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类赋值。除了字段是必须字段其他的都是非必须字段,配置的原因主要是为了设置各个子类BEAN的默认值]


     

           
          
   



      
       
            com.microsoft.jdbc.sqlserver.SQLServerDriver>
            jdbc:sqlserver://192.168.60.214:1433;DatabaseName=jobcn_cti_snapshot>
            JCNEPxxxx
            abc
       

       
           
                     192.168.60.131
                     JCNEPxxx
                     xxx
                     [email protected]
                     [email protected] 
           

           
                    JCNEPxxx
           

           
                   158xxxxxxxx
           

       

       
                  0/10 * * * * ?
                  true
       

       
            \\errorlog\\Jobcn_Cti_SnapShot_TelLog2\\
           
            \\imlog\\SMS\\
            \\imlog\\CTI\\
            \\imlog\\MAIL\\
       

        false
   

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



 
 
   
      com.microsoft.jdbc.sqlserver.SQLServerDriver
      jdbc:sqlserver://192.168.60.214:1433;DatabaseName=jobcn_cti_snapshot
      JCNEP3160
      JCNEP3160abc
   

   
     
     
   

   
      \\errorlog\\Test\\
      \\imlog\\SMS\\
      \\imlog\\CTI\\
      \\imlog\\MAIL\\
   

 

 
 

 
 
 

 
 
 
    \\errorlog\\cticlient\\AAAAAAA\\
 

 

 
 
    192.168.60.131
    JCNEP3160
    820815
    [email protected]
    [email protected]
    测试主题
 

 
 
 
    JCNEP3160
 

 
 
 
    15818375674
 

 
 
 
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
    root
    root
    Test
 

 

 
 
    TestConsole
 

 
    TestConsole
 

日志记录功能

系统提供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.第二个数组元素是所要记录的日志信息。

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


    TestConsole
 

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

例如:


 
 

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


    A

   B
 

通过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子节点的值.

例如:


    192.168.60.131
    JCNEP3160
    820815
    [email protected]
    [email protected]
    测试主题
 

通过传入的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.后台管理主页面

 

2.菜单功能介绍

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

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

 

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

 

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分运行。

你可能感兴趣的:(其他技术篇)