1.模块功能:
1.对web服务器进行ping操作,如果ping不通,则上报web服务器无法ping通.
如果可以ping通,继续测试web服务是否可以访问,如果不能访问则上报web服务无法访问故障.
2.对数据库服务器进行ping操作,如果ping不通,则上报数据库服务器无法ping通.
如果可以ping通,继续测试web服务是否可以访问,如果不能访问则上报数据库无法连接故障.
2.主要技术点:
1.通过使用threadlocal线程变量解决多线程(并且每个线程都拥有自己的变量)并发的问题.
2.通过使用dom4j解析xml文件使程序更具扩展性(支持多层, 约定优于配置: 一个property下面必须有一个rule).
同时注意用dom4j解析xml文件,必须依赖于jaxen类库.
package com.ilucky.malf.rule;import java.io.ioexception;import java.io.inputstream;import java.util.hashmap;import java.util.list;import java.util.map;import org.apache.commons.beanutils.beanutils;import org.dom4j.document;import org.dom4j.documentexception;import org.dom4j.element;import org.dom4j.io.saxreader;import com.ilucky.malf.rule.baserule;/** * @author iluckysi * @date 20140727 */public class rulebuilder { private static rulebuilder instance; public static final string id = id; public static final string name = name; public static final string type = type; public static final string property = property; private map map = new hashmap(); public static rulebuilder getinstance() { if(instance == null) { instance = new rulebuilder(); } return instance; } @suppresswarnings(unchecked) private rulebuilder() { string malfrulepath = /com/ilucky/malf/malf_rule.xml; inputstream is = null; document document = null; try { is = this.getclass().getresourceasstream(malfrulepath); saxreader saxreader = new saxreader(); document = saxreader.read(is); element root = document.getrootelement(); list rootchildren = root.elements(); for(int i = 0; rootchildren != null && i propertyelements = element.selectnodes(property); for(int i = 0; propertyelements != null && i ruleelements = propertyelement.elements(); if(!ruleelements.isempty()){ element ruleelement = ruleelements.get(0); beanutils.setproperty(baserule, propertyname, build(ruleelement)); } } } catch (exception e) { system.out.println(解析故障规则配置文件失败: + e.tostring()); } return baserule; } public baserule build(string id) { return map.get(id); }}
3.通过使用quartz任务调度器创建简单定时任务.
package com.ilucky.malf.quartz;import java.text.parseexception;import org.quartz.crontrigger;import org.quartz.jobdetail;import org.quartz.scheduler;import org.quartz.schedulerexception;import org.quartz.schedulerfactory;import org.quartz.trigger;import org.quartz.impl.stdschedulerfactory;/** * @author iluckysi * @date 20140727 */public class malfquartz { private int cycle = 30; private static final string trigger_name= triggername; private static final string trigger_group_name = triggergroupname; private static final string job_name = jobname; private static final string job_group_name = jobgroupname; public void start(){ schedulerfactory schedulerfactory = new stdschedulerfactory(); scheduler scheduler; try { scheduler = schedulerfactory.getscheduler(); scheduler.schedulejob(createjobdetail(), createtrigger(cycle)); scheduler.start(); system.out.println(故障检测定时任务启动成功!); } catch (schedulerexception e) { system.out.println(故障检测定时任务启动失败: +e.getmessage()); } } private trigger createtrigger(int cycle) { string cron = 0/ + cycle + * * * * ?; crontrigger trigger = new crontrigger(trigger_name, trigger_group_name); try { trigger.setcronexpression(cron); } catch (parseexception e) { e.printstacktrace(); } return trigger; } private jobdetail createjobdetail() { return new jobdetail(job_name, job_group_name, malfjob.class); }}
4.测试数据库是否可以正常连接.
5.测试web服务是否可以正常访问.
6.在java文件中获取web-inf路径.
7.使用beanutils的setproerpty方法要保证bean为此property提供了set方法.
8.检测web服务是否可以访问除了用commons-httpclient类库,还要依赖common-codec,否则执行
httpmethod method = new getmethod(url)命令时,会卡死在这里.
9.pingutil里面有一个processmonitor线程,此线程的目的是如果ping主机的线程一直等待,
那么最长时间等待10秒,超过10秒后由processmonitor线程将其杀死.
10.另外测试主机是否可以ping通,并不一定要通过分析返回结果.
3.功能扩展.
1.故障规则配置文件支持多层配置,即多层嵌套,直接看配置文件:
2.条件之间可以建立多种关系(与,或,非,异或等).
3.如果要加其他故障测试,只需要修改一下配置文件,然后写工具类,无需修改原有代码.
最后看测试类:
package com.ilucky.malf;import java.util.arraylist;import java.util.hashmap;import java.util.list;import java.util.map;import com.ilucky.malf.quartz.malfquartz;/** * @author iluckysi * @date 20140727 */public class maintest { public static map>> datasource= new hashmap>>(); public static void main(string[] arsg) { //模拟web测试数据. list> webs = new arraylist>(); map map1 = new hashmap(); map1.put(type, web服务); map1.put(ip, 192.168.72.149); map1.put(url, http://192.168.72.149:8080); webs.add(map1); map map2 = new hashmap(); map2.put(type, web服务); map2.put(ip, 192.168.72.153); map2.put(url, http://192.168.72.153:8080); webs.add(map2); map map3 = new hashmap(); map3.put(type, web服务); map3.put(ip, 192.168.72.253); map3.put(url, http://192.168.72.253:8080); webs.add(map3); datasource.put(malf_web, webs); //模拟数据库测试数据. list> databases = new arraylist>(); map map4 = new hashmap(); map4.put(type, 数据库服务); map4.put(ip, 192.168.73.236); map4.put(username, system); map4.put(password, talent); map4.put(url, jdbc:oracle:thin:@192.168.73.236:1521:k3); map4.put(sql, select 1 from dual); map4.put(driver, oracle.jdbc.driver.oracledriver); databases.add(map4); map map5 = new hashmap(); map5.put(type, 数据库服务); map5.put(ip, 192.168.67.130); map5.put(username, k3); map5.put(password, k3); map5.put(url, jdbc:oracle:thin:@192.168.67.130:1521:kongsan); map5.put(sql, select 1 from dual); map5.put(driver, oracle.jdbc.driver.oracledriver); databases.add(map5); map map6 = new hashmap(); map6.put(type, 数据库服务); map6.put(ip, 192.168.72.153); map6.put(username, core); map6.put(password, core); map6.put(url, jdbc:oracle:thin:@192.168.72.153:1521:core); map6.put(sql, select 1 from dual); map6.put(driver, oracle.jdbc.driver.oracledriver); databases.add(map6); datasource.put(malf_database, databases); //创建任务调度器:30秒检测一次. new malfquartz().start(); }}
只把一部分代码贴出来了,看如下项目目录:
