1.模块功能: 1.对web服务器进行ping操作,如果ping不通,则上报web服务器无法ping通. 如果可以ping通,继续测试web服务是否可以访问,如果不能访问则上报web服务无法访问故障. 2.对数据库服务器进行ping操作,如果ping不通,则上报数据库服务器无法ping通. 如果可
1.模块功能:同时注意用dom4j解析xml文件,必须依赖于jaxen类库.
<span style="font-size:12px;">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<string baserule> map = new HashMap<string baserule>(); 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<element> 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); } } </element></string></string></span>
3.通过使用quartz任务调度器创建简单定时任务.
<span style="font-size:12px;">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); } } </span>
1.故障规则配置文件支持多层配置,即多层嵌套,直接看配置文件:
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?> <root> <rule id="malf_web" name="web故障测试" type="com.ilucky.malf.rule.AndRule"> <property name="leftRule"> <rule id="ping_web" name="ping web服务器测试" type="com.ilucky.malf.rule.web.PingWebRule"></rule> </property> <property name="rightRule"> <rule id="access_web" name="访问web服务测试" type="com.ilucky.malf.rule.web.AccessWebRule"></rule> </property> </rule> <rule id="malf_database" name="数据库故障测试" type="com.ilucky.malf.rule.AndRule"> <property name="leftRule"> <rule id="ping_database" name="ping数据库服务器测试" type="com.ilucky.malf.rule.database.PingDatabaseRule"></rule> </property> <property name="rightRule"> <rule id="connect_database" name="连接数据库服务测试" type="com.ilucky.malf.rule.database.ConnectDatabaseRule"></rule> </property> </rule> </root></span>
3.如果要加其他故障测试,只需要修改一下配置文件,然后写工具类,无需修改原有代码.
最后看测试类:
<span style="font-size:12px;">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<string list string>>> datasource= new HashMap<string list string>>>(); public static void main(String[] arsg) { //模拟web测试数据. List<map string>> webs = new ArrayList<map string>>(); Map<string string> map1 = new HashMap<string string>(); map1.put("type", "web服务"); map1.put("ip", "192.168.72.149"); map1.put("url", "http://192.168.72.149:8080"); webs.add(map1); Map<string string> map2 = new HashMap<string string>(); map2.put("type", "web服务"); map2.put("ip", "192.168.72.153"); map2.put("url", "http://192.168.72.153:8080"); webs.add(map2); Map<string string> map3 = new HashMap<string string>(); 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<map string>> databases = new ArrayList<map string>>(); Map<string string> map4 = new HashMap<string string>(); 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<string string> map5 = new HashMap<string string>(); 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<string string> map6 = new HashMap<string string>(); 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(); } } </string></string></string></string></string></string></map></map></string></string></string></string></string></string></map></map></string></string></span>