数据库故障和web故障检测模块!
程序员文章站
2022-06-10 13:20:24
...
1.模块功能: 1.对web服务器进行ping操作,如果ping不通,则上报web服务器无法ping通. 如果可以ping通,继续测试web服务是否可以访问,如果不能访问则上报web服务无法访问故障. 2.对数据库服务器进行ping操作,如果ping不通,则上报数据库服务器无法ping通. 如果可
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
只把一部分代码贴出来了,看如下项目目录:
上一篇: 深入Nginx + PHP 缓存详解
下一篇: 用php或js获取图片大小,高宽尺寸.