欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

数据库故障和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> 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();
	}
}
只把一部分代码贴出来了,看如下项目目录:

数据库故障和web故障检测模块!