Home > Database > Mysql Tutorial > 数据库故障和web故障检测模块!

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 15:42:02
Original
1316 people have browsed it

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类库.

<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>
Copy after login

    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>
Copy after login
    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.故障规则配置文件支持多层配置,即多层嵌套,直接看配置文件:

<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>
Copy after login
   2.条件之间可以建立多种关系(与,或,非,异或等).

   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>
Copy after login
只把一部分代码贴出来了,看如下项目目录:

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

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template