package com.intelitune.quartz;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class XmlDomParse {
private static XmlDomParse xmlDom = null;
private Document document;
public Document getDocument() {
return document;
}
/**
* 构造方法私有化
*/
private XmlDomParse() {// 单例模式
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 初始化工厂
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();// 得到dom解析
document = builder.parse(this.getClass().getResource("/").getPath() + "quartz.xml");// 加载xml文件
System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml 解析完成");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 单例模式创建XmlDomParse实例,通过getInstance()可以获取XmlDomParse实例<br>
*
* @return xmlDom , XmlDomParse实例。通过该实例可以调用方法来操作XML文件<br>
*/
public static XmlDomParse getInstance() {
if (xmlDom == null) {
xmlDom = new XmlDomParse();
}
return xmlDom;
}
/**
* 在修改document后,可以使用jdk提供的Transformer将dom树转换成xml。<br>
*
* @param document
* quartz.xml的dom树<br>
*/
public void doc2XmlFile(Document document) {
// 在修改document后,可以使用jdk提供的Transformer讲dom树转换成xml。
Source xmlSource = new DOMSource(document);
TransformerFactory factory = TransformerFactory.newInstance(); // 初始化工厂
try {
Transformer transformer = factory.newTransformer();
Result result = new StreamResult(new File(this.getClass().getResource("/").getPath() + "quartz.xml"));
//System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml 更新完成");
transformer.transform(xmlSource, result); // 保存dom至目的文件
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据传入的的jobName和jobGroup,检查JobDetail中是否存在name和group与之相同的实例<br>
*
* @param jobName
* 想要找的name<br>
* @param jobGroup
* 想要找的group<br>
* @return 返回true时存在该JobDetail实例,返回false表示不存在<br>
*/
// 已知一个Trigger的jobName及jobGroup,判定该jobname是否有相应的jobdetail在XML中存在
public synchronized boolean checkJobDetail(String jobName, String jobGroup) {
JobDetailBean jobDetailBean = getJobDetailBean(jobName, jobGroup);
if (jobDetailBean!=null) {
if (jobDetailBean.getName() != null && !(jobDetailBean.getName().trim().equals(""))&&
jobDetailBean.getGroup() != null && !(jobDetailBean.getGroup().trim().equals(""))&&
jobDetailBean.getJobClass() != null&& !(jobDetailBean.getJobClass().trim().equals(""))) {
return true;
}
}
return false;
}
/**
* 根据Trigger的name和group属性值判断该Trigger是否已经存在
*
* @param name
* @param group
* @return 如果找到满足该条件的返回true,没有找到返回false
*/
public synchronized boolean checkTrigger(String name, String group) {
boolean nameFlag = false;
boolean groupFlag = false;
NodeList tagNodes = document.getElementsByTagName("simple");
for (int i = 0; i < tagNodes.getLength(); i++) {
NodeList target = tagNodes.item(i).getChildNodes();
for (int j = 0; j < target.getLength(); j++) {
if (target.item(j).getNodeName().equals("name") && target.item(j).getTextContent().equals(name)) {
nameFlag = true;
}
if (target.item(j).getNodeName().equals("group") && target.item(j).getTextContent().equals(group)) {
groupFlag = true;
}
if (nameFlag && groupFlag) {
return true;
}
}
}
return false;
}
public synchronized boolean updateTrigger(JobExecutionContext jct) {
Logger log = Logger.getLogger(jct.getJobDetail().getJobClass());
log.info("当前正在执行的作业是 " + jct.getJobDetail().getFullName() +" "+ DateString.date2String(new Date()));
JobDetail jobDetail = jct.getJobDetail();
SimpleTrigger trigger = (SimpleTrigger) jct.getTrigger();
JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(jobDetail.getName(), jobDetail.getGroup());
TriggerBean triggerBean = xmlDom.getTriggerBean(jobDetail.getName(), jobDetail.getGroup());
triggerBean.setNextFireTime(DateString.date2String(trigger.getNextFireTime()));
triggerBean.setPreviousFireTime(DateString.date2String(trigger.getPreviousFireTime()));
triggerBean.setSuccessTriggered((Integer.parseInt(triggerBean.getSuccessTriggered()) + 1) + "");
xmlDom.updateJob(jobDetailBean, triggerBean);
return false;
}
public synchronized List<JobAndSimpleTrigger> getJobAndSimpleTriggers() {
List<JobAndSimpleTrigger> jastList = new ArrayList<JobAndSimpleTrigger>();
NodeList jobNodes = xmlDom.getDocument().getElementsByTagName("job-detail");// 得到标签名为job-detail的所有集合
for (int i = 0; i < jobNodes.getLength(); i++) {// 遍历节点名称为job-detail的所有集合
NodeList childNodes = jobNodes.item(i).getChildNodes();// 得到job-detail的所有子节点集合
for (int j = 0; j < childNodes.getLength(); j++) {// 遍历集合
if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
if (childNodes.item(j).getNodeName().equals("name")) {// 得到节点名称为name的节点
NodeList brolist = childNodes.item(j).getParentNode().getChildNodes();// 得到name的所有兄弟节点
for (int k = 0; k < brolist.getLength(); k++) {
if (brolist.item(k).getNodeName().equals("group")) {
JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());
TriggerBean triggerBean = xmlDom.getTriggerBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());
JobAndSimpleTrigger jast = new JobAndSimpleTrigger(jobDetailBean, triggerBean);
jastList.add(jast);
}
}
}
}
}
}
return jastList;
}
/**
* 修改一个Job,不能修改其JobDetail的name和group 策略就是先删除后再次创建<br>
* 封装jobDetail中的数据到jobDetailBean中<br>
* 封装trigger中的数据到triggerBean中<br>
*
* @param jobDetailBean
* 封装jobDetail数据<br>
* @param triggerBean
* 封装trigger数据<br>
*/
public synchronized void updateJob(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
deleteJob(jobDetailBean.getName(), jobDetailBean.getGroup());
createJobElement(jobDetailBean, triggerBean);
}
/**
* 根据name和group可以指定一个唯一的JobDetail<br>
* 对xml进行操作,删除关于这个JobDetail的所有工作Job节点信息<br>
*
* @param name
* JobDetail中的name<br>
* @param group
* JobDetail中的group<br>
*/
// 删除整个job及其所有子节点
public synchronized void deleteJob(String name, String group) {
NodeList nameList = document.getElementsByTagName("name");// 得到name的节点集合
for (int i = 0; i < nameList.getLength(); i++) {
if (nameList.item(i).getTextContent().equals(name)) {// 找到name节点的文本值为name的那个name节点
Node node = nameList.item(i).getParentNode();// 得到他的父亲节点job-detail
NodeList list = node.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
if (list.item(j).getTextContent().equals(group)) {
// System.out.println(nameList.item(i).getTextContent()+"======"+list.item(j).getTextContent());
Node targetJob = nameList.item(i).getParentNode().getParentNode();// 得到我们要找的最大的父节点Job
// System.out.println(targetJob.getNodeName()+"123456789");
for (int k = 0; k < targetJob.getChildNodes().getLength(); k++) {
Node targetNode1 = targetJob.getChildNodes().item(k);// 得到我们要找的二级节点
for (int l = 0; l < targetNode1.getChildNodes().getLength(); l++) {
Node targetNode2 = targetNode1.getChildNodes().item(l);// 得到我们要找的三级节点
for (int m = 0; m < targetNode2.getChildNodes().getLength(); m++) {
Node targetNode3 = targetNode2.getChildNodes().item(m);
for (int n = 0; n < targetNode3.getChildNodes().getLength(); n++) {
targetNode3.removeChild(targetNode3.getChildNodes().item(n));
}
targetNode2.removeChild(targetNode3);
}
targetNode1.removeChild(targetNode2);
}
targetJob.removeChild(targetNode1);
}
targetJob.getParentNode().removeChild(targetJob);
}
}
}
}
doc2XmlFile(getDocument());
}
/**
* 根据jobName、jobGroup在xml中找到相应的信息,保存到JobDetailBean中,
* 通过该方法可以找到想要找的JobDetailBean实例<br>
*
* @param jobName
* JobDetail中的name<br>
* @param jobGroup
* JobDetail中的group<br>
* @return 通过该方法可以找到想要找的JobDetailBean实例
*/
// tagName其实就是name标签 从XML文件中查找满足条件的JobDetail,并返回
public synchronized JobDetailBean getJobDetailBean(String jobName, String jobGroup) {
NodeList tagNodes = document.getElementsByTagName("name");// 得到name标签的集合
JobDetailBean jobDetailBean = new JobDetailBean();// 创建一个JobDetailBean类型实例
for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历name标签集合
if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足name标签的文本内容是和jobDetailName相同,执行下面的语句
Node parentNode = tagNodes.item(i).getParentNode();// 得到name所在的父节点JobDetail
NodeList jobDetailNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签name的所有兄弟节点
for (int j = 0; j < jobDetailNodes.getLength(); j++) {
if (jobDetailNodes.item(j).getTextContent().equals(jobGroup)) {
// System.out.println("name :"+tagNodes.item(i).getTextContent()+" group :"+jobDetailNodes.item(j).getTextContent());
NodeList target = jobDetailNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
for (int k = 0; k < target.getLength(); k++) {
if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
// (short)1
// System.out.println(target.item(k).getNodeName()+" jobdetail");
if (target.item(k).getNodeName().equals("name")) {
jobDetailBean.setName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("group")) {
jobDetailBean.setGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("description")) {
jobDetailBean.setDescription(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-class")) {
jobDetailBean.setJobClass(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-state")) {
jobDetailBean.setJobState(target.item(k).getTextContent());
}
}
}
}
}
}
}
return jobDetailBean;
}
/**
* 从XML文件中查找满足条件的Trigger并返回<br>
*
* @param jobName
* JobDetail中的name<br>
* @param jobGroup
* JobDetail中的group<br>
* @return 通过该方法可以找到想要找的TriggerBean实例
*/
public synchronized TriggerBean getTriggerBean(String jobName, String jobGroup) {
NodeList tagNodes = document.getElementsByTagName("job-name");// 得到job-name标签的集合
TriggerBean triggerBean = new TriggerBean();// 创建一个TriggerBean类型实例
for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历job-name标签集合
if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足job-name标签的文本内容是和jobDetailName相同,执行下面的语句
Node parentNode = tagNodes.item(i).getParentNode();// 得到job-name等于相应值所在的父节点
NodeList triggerNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签job-name的所有兄弟节点
for (int j = 0; j < triggerNodes.getLength(); j++) {
if (triggerNodes.item(j).getTextContent().equals(jobGroup)) {
// System.out.println("job-name :"+tagNodes.item(i).getTextContent()+" job-group :"+triggerNodes.item(j).getTextContent());
NodeList target = triggerNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
for (int k = 0; k < target.getLength(); k++) {
if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
// System.out.println(target.item(k).getNodeName()+" trigger");
if (target.item(k).getNodeName().equals("name")) {
triggerBean.setName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("group")) {
triggerBean.setGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-name")) {
triggerBean.setJobName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-group")) {
triggerBean.setJobGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("description")) {
triggerBean.setDescription(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("start-time")) {
triggerBean.setStartTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("end-time")) {
triggerBean.setEndTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("next-fire-time")) {
triggerBean.setNextFireTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("previous-fire-time")) {
triggerBean.setPreviousFireTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("repeat-count")) {
triggerBean.setRepeatCount(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("repeat-interval")) {
triggerBean.setRepeatInterval(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("priority")) {
triggerBean.setPriority(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("success-triggered")) {
triggerBean.setSuccessTriggered(target.item(k).getTextContent());
}
}
}
}
}
}
}
return triggerBean;
}
// 往Quartz.xml中加入新的调度任务
// 每次创建都是一个从<job><job-detail></job-detail><trigger></trigger></job>的标签
/**
* 在表单的表单域中的内容全部填充到JobDetailBean,和TriggerBean中,调用该方法就可以将该Job任务保存到xml中<br>
*
*/
public synchronized void createJobElement(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
Node root = document.getDocumentElement();// 获得根节点<quartz>
// 在XML中创建JobDetail相关数据的配置信息
Element job = document.createElement("job");// 创建job标签
Element jobDetail = document.createElement("job-detail");// 创建job-detail标签
Element job_Name = document.createElement("name");// 创建name标签
Text text = document.createTextNode(jobDetailBean.getName());// 创建name的文本
job_Name.appendChild(text);// 将文本添加到name标签中
jobDetail.appendChild(job_Name);// 将name添加为job-detail的子标签
Element job_Group = document.createElement("group");
text = document.createTextNode(jobDetailBean.getGroup());
job_Group.appendChild(text);
jobDetail.appendChild(job_Group);
Element jobclass = document.createElement("job-class");
text = document.createTextNode(jobDetailBean.getJobClass());
jobclass.appendChild(text);
jobDetail.appendChild(jobclass);
Element jobState = document.createElement("job-state");
text = document.createTextNode(jobDetailBean.getJobState());
jobState.appendChild(text);
jobDetail.appendChild(jobState);
Element desc = document.createElement("description");
text = document.createTextNode(StringUtils.isEmpty(jobDetailBean.getDescription()) ? "" : jobDetailBean.getDescription());
desc.appendChild(text);
jobDetail.appendChild(desc);
job.appendChild(jobDetail);// 将job-detail标签添加为job的子标签
// 通过前面已经配置了JobDetail,通过JobDatail中的name和group等于Trigger中的jobname、jobgroup找到相应的job,
// 然后在Job下面创建子标记<cron>或<simple>,再创建Trigger相关数据的配置
Element trigger = document.createElement("trigger");// 创建trigger节点
Element simple = document.createElement("simple");
Element name = document.createElement("name");
text = document.createTextNode(triggerBean.getName());
name.appendChild(text);
simple.appendChild(name);
Element group = document.createElement("group");
text = document.createTextNode(triggerBean.getGroup());
group.appendChild(text);
simple.appendChild(group);
Element jobNameElement = document.createElement("job-name");
text = document.createTextNode(triggerBean.getJobName());
jobNameElement.appendChild(text);
simple.appendChild(jobNameElement);
Element jobGroupElement = document.createElement("job-group");
text = document.createTextNode(triggerBean.getJobGroup());
jobGroupElement.appendChild(text);
simple.appendChild(jobGroupElement);
Element description = document.createElement("description");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getDescription()) ? "" : triggerBean.getDescription());
description.appendChild(text);
simple.appendChild(description);
Element startTime = document.createElement("start-time");
text = document.createTextNode(triggerBean.getStartTime());
startTime.appendChild(text);
simple.appendChild(startTime);
Element priority = document.createElement("priority");
text = document.createTextNode(triggerBean.getPriority());
priority.appendChild(text);
simple.appendChild(priority);
Element repeatCount = document.createElement("repeat-count");
text = document.createTextNode(triggerBean.getRepeatCount());
repeatCount.appendChild(text);
simple.appendChild(repeatCount);
Element repeatInterval = document.createElement("repeat-interval");
text = document.createTextNode(triggerBean.getRepeatInterval());
repeatInterval.appendChild(text);
simple.appendChild(repeatInterval);
Element successTriggered = document.createElement("success-triggered");
text = document.createTextNode(triggerBean.getSuccessTriggered());
successTriggered.appendChild(text);
simple.appendChild(successTriggered);
Element endTime = document.createElement("end-time");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getEndTime()) ? "" : triggerBean.getEndTime());
endTime.appendChild(text);
simple.appendChild(endTime);
Element nextFireTime = document.createElement("next-fire-time");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getNextFireTime()) ? "" : triggerBean.getNextFireTime());
nextFireTime.appendChild(text);
simple.appendChild(nextFireTime);
Element preFireTime = document.createElement("previous-fire-time");
text = document.createTextNode(triggerBean.getPreviousFireTime());
preFireTime.appendChild(text);
simple.appendChild(preFireTime);
trigger.appendChild(simple);
job.appendChild(trigger);
root.appendChild(job);
doc2XmlFile(getDocument());
}
}
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class XmlDomParse {
private static XmlDomParse xmlDom = null;
private Document document;
public Document getDocument() {
return document;
}
/**
* 构造方法私有化
*/
private XmlDomParse() {// 单例模式
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 初始化工厂
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();// 得到dom解析
document = builder.parse(this.getClass().getResource("/").getPath() + "quartz.xml");// 加载xml文件
System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml 解析完成");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 单例模式创建XmlDomParse实例,通过getInstance()可以获取XmlDomParse实例<br>
*
* @return xmlDom , XmlDomParse实例。通过该实例可以调用方法来操作XML文件<br>
*/
public static XmlDomParse getInstance() {
if (xmlDom == null) {
xmlDom = new XmlDomParse();
}
return xmlDom;
}
/**
* 在修改document后,可以使用jdk提供的Transformer将dom树转换成xml。<br>
*
* @param document
* quartz.xml的dom树<br>
*/
public void doc2XmlFile(Document document) {
// 在修改document后,可以使用jdk提供的Transformer讲dom树转换成xml。
Source xmlSource = new DOMSource(document);
TransformerFactory factory = TransformerFactory.newInstance(); // 初始化工厂
try {
Transformer transformer = factory.newTransformer();
Result result = new StreamResult(new File(this.getClass().getResource("/").getPath() + "quartz.xml"));
//System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml 更新完成");
transformer.transform(xmlSource, result); // 保存dom至目的文件
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据传入的的jobName和jobGroup,检查JobDetail中是否存在name和group与之相同的实例<br>
*
* @param jobName
* 想要找的name<br>
* @param jobGroup
* 想要找的group<br>
* @return 返回true时存在该JobDetail实例,返回false表示不存在<br>
*/
// 已知一个Trigger的jobName及jobGroup,判定该jobname是否有相应的jobdetail在XML中存在
public synchronized boolean checkJobDetail(String jobName, String jobGroup) {
JobDetailBean jobDetailBean = getJobDetailBean(jobName, jobGroup);
if (jobDetailBean!=null) {
if (jobDetailBean.getName() != null && !(jobDetailBean.getName().trim().equals(""))&&
jobDetailBean.getGroup() != null && !(jobDetailBean.getGroup().trim().equals(""))&&
jobDetailBean.getJobClass() != null&& !(jobDetailBean.getJobClass().trim().equals(""))) {
return true;
}
}
return false;
}
/**
* 根据Trigger的name和group属性值判断该Trigger是否已经存在
*
* @param name
* @param group
* @return 如果找到满足该条件的返回true,没有找到返回false
*/
public synchronized boolean checkTrigger(String name, String group) {
boolean nameFlag = false;
boolean groupFlag = false;
NodeList tagNodes = document.getElementsByTagName("simple");
for (int i = 0; i < tagNodes.getLength(); i++) {
NodeList target = tagNodes.item(i).getChildNodes();
for (int j = 0; j < target.getLength(); j++) {
if (target.item(j).getNodeName().equals("name") && target.item(j).getTextContent().equals(name)) {
nameFlag = true;
}
if (target.item(j).getNodeName().equals("group") && target.item(j).getTextContent().equals(group)) {
groupFlag = true;
}
if (nameFlag && groupFlag) {
return true;
}
}
}
return false;
}
public synchronized boolean updateTrigger(JobExecutionContext jct) {
Logger log = Logger.getLogger(jct.getJobDetail().getJobClass());
log.info("当前正在执行的作业是 " + jct.getJobDetail().getFullName() +" "+ DateString.date2String(new Date()));
JobDetail jobDetail = jct.getJobDetail();
SimpleTrigger trigger = (SimpleTrigger) jct.getTrigger();
JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(jobDetail.getName(), jobDetail.getGroup());
TriggerBean triggerBean = xmlDom.getTriggerBean(jobDetail.getName(), jobDetail.getGroup());
triggerBean.setNextFireTime(DateString.date2String(trigger.getNextFireTime()));
triggerBean.setPreviousFireTime(DateString.date2String(trigger.getPreviousFireTime()));
triggerBean.setSuccessTriggered((Integer.parseInt(triggerBean.getSuccessTriggered()) + 1) + "");
xmlDom.updateJob(jobDetailBean, triggerBean);
return false;
}
public synchronized List<JobAndSimpleTrigger> getJobAndSimpleTriggers() {
List<JobAndSimpleTrigger> jastList = new ArrayList<JobAndSimpleTrigger>();
NodeList jobNodes = xmlDom.getDocument().getElementsByTagName("job-detail");// 得到标签名为job-detail的所有集合
for (int i = 0; i < jobNodes.getLength(); i++) {// 遍历节点名称为job-detail的所有集合
NodeList childNodes = jobNodes.item(i).getChildNodes();// 得到job-detail的所有子节点集合
for (int j = 0; j < childNodes.getLength(); j++) {// 遍历集合
if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
if (childNodes.item(j).getNodeName().equals("name")) {// 得到节点名称为name的节点
NodeList brolist = childNodes.item(j).getParentNode().getChildNodes();// 得到name的所有兄弟节点
for (int k = 0; k < brolist.getLength(); k++) {
if (brolist.item(k).getNodeName().equals("group")) {
JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());
TriggerBean triggerBean = xmlDom.getTriggerBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());
JobAndSimpleTrigger jast = new JobAndSimpleTrigger(jobDetailBean, triggerBean);
jastList.add(jast);
}
}
}
}
}
}
return jastList;
}
/**
* 修改一个Job,不能修改其JobDetail的name和group 策略就是先删除后再次创建<br>
* 封装jobDetail中的数据到jobDetailBean中<br>
* 封装trigger中的数据到triggerBean中<br>
*
* @param jobDetailBean
* 封装jobDetail数据<br>
* @param triggerBean
* 封装trigger数据<br>
*/
public synchronized void updateJob(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
deleteJob(jobDetailBean.getName(), jobDetailBean.getGroup());
createJobElement(jobDetailBean, triggerBean);
}
/**
* 根据name和group可以指定一个唯一的JobDetail<br>
* 对xml进行操作,删除关于这个JobDetail的所有工作Job节点信息<br>
*
* @param name
* JobDetail中的name<br>
* @param group
* JobDetail中的group<br>
*/
// 删除整个job及其所有子节点
public synchronized void deleteJob(String name, String group) {
NodeList nameList = document.getElementsByTagName("name");// 得到name的节点集合
for (int i = 0; i < nameList.getLength(); i++) {
if (nameList.item(i).getTextContent().equals(name)) {// 找到name节点的文本值为name的那个name节点
Node node = nameList.item(i).getParentNode();// 得到他的父亲节点job-detail
NodeList list = node.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
if (list.item(j).getTextContent().equals(group)) {
// System.out.println(nameList.item(i).getTextContent()+"======"+list.item(j).getTextContent());
Node targetJob = nameList.item(i).getParentNode().getParentNode();// 得到我们要找的最大的父节点Job
// System.out.println(targetJob.getNodeName()+"123456789");
for (int k = 0; k < targetJob.getChildNodes().getLength(); k++) {
Node targetNode1 = targetJob.getChildNodes().item(k);// 得到我们要找的二级节点
for (int l = 0; l < targetNode1.getChildNodes().getLength(); l++) {
Node targetNode2 = targetNode1.getChildNodes().item(l);// 得到我们要找的三级节点
for (int m = 0; m < targetNode2.getChildNodes().getLength(); m++) {
Node targetNode3 = targetNode2.getChildNodes().item(m);
for (int n = 0; n < targetNode3.getChildNodes().getLength(); n++) {
targetNode3.removeChild(targetNode3.getChildNodes().item(n));
}
targetNode2.removeChild(targetNode3);
}
targetNode1.removeChild(targetNode2);
}
targetJob.removeChild(targetNode1);
}
targetJob.getParentNode().removeChild(targetJob);
}
}
}
}
doc2XmlFile(getDocument());
}
/**
* 根据jobName、jobGroup在xml中找到相应的信息,保存到JobDetailBean中,
* 通过该方法可以找到想要找的JobDetailBean实例<br>
*
* @param jobName
* JobDetail中的name<br>
* @param jobGroup
* JobDetail中的group<br>
* @return 通过该方法可以找到想要找的JobDetailBean实例
*/
// tagName其实就是name标签 从XML文件中查找满足条件的JobDetail,并返回
public synchronized JobDetailBean getJobDetailBean(String jobName, String jobGroup) {
NodeList tagNodes = document.getElementsByTagName("name");// 得到name标签的集合
JobDetailBean jobDetailBean = new JobDetailBean();// 创建一个JobDetailBean类型实例
for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历name标签集合
if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足name标签的文本内容是和jobDetailName相同,执行下面的语句
Node parentNode = tagNodes.item(i).getParentNode();// 得到name所在的父节点JobDetail
NodeList jobDetailNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签name的所有兄弟节点
for (int j = 0; j < jobDetailNodes.getLength(); j++) {
if (jobDetailNodes.item(j).getTextContent().equals(jobGroup)) {
// System.out.println("name :"+tagNodes.item(i).getTextContent()+" group :"+jobDetailNodes.item(j).getTextContent());
NodeList target = jobDetailNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
for (int k = 0; k < target.getLength(); k++) {
if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
// (short)1
// System.out.println(target.item(k).getNodeName()+" jobdetail");
if (target.item(k).getNodeName().equals("name")) {
jobDetailBean.setName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("group")) {
jobDetailBean.setGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("description")) {
jobDetailBean.setDescription(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-class")) {
jobDetailBean.setJobClass(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-state")) {
jobDetailBean.setJobState(target.item(k).getTextContent());
}
}
}
}
}
}
}
return jobDetailBean;
}
/**
* 从XML文件中查找满足条件的Trigger并返回<br>
*
* @param jobName
* JobDetail中的name<br>
* @param jobGroup
* JobDetail中的group<br>
* @return 通过该方法可以找到想要找的TriggerBean实例
*/
public synchronized TriggerBean getTriggerBean(String jobName, String jobGroup) {
NodeList tagNodes = document.getElementsByTagName("job-name");// 得到job-name标签的集合
TriggerBean triggerBean = new TriggerBean();// 创建一个TriggerBean类型实例
for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历job-name标签集合
if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足job-name标签的文本内容是和jobDetailName相同,执行下面的语句
Node parentNode = tagNodes.item(i).getParentNode();// 得到job-name等于相应值所在的父节点
NodeList triggerNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签job-name的所有兄弟节点
for (int j = 0; j < triggerNodes.getLength(); j++) {
if (triggerNodes.item(j).getTextContent().equals(jobGroup)) {
// System.out.println("job-name :"+tagNodes.item(i).getTextContent()+" job-group :"+triggerNodes.item(j).getTextContent());
NodeList target = triggerNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
for (int k = 0; k < target.getLength(); k++) {
if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
// System.out.println(target.item(k).getNodeName()+" trigger");
if (target.item(k).getNodeName().equals("name")) {
triggerBean.setName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("group")) {
triggerBean.setGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-name")) {
triggerBean.setJobName(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("job-group")) {
triggerBean.setJobGroup(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("description")) {
triggerBean.setDescription(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("start-time")) {
triggerBean.setStartTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("end-time")) {
triggerBean.setEndTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("next-fire-time")) {
triggerBean.setNextFireTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("previous-fire-time")) {
triggerBean.setPreviousFireTime(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("repeat-count")) {
triggerBean.setRepeatCount(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("repeat-interval")) {
triggerBean.setRepeatInterval(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("priority")) {
triggerBean.setPriority(target.item(k).getTextContent());
} else if (target.item(k).getNodeName().equals("success-triggered")) {
triggerBean.setSuccessTriggered(target.item(k).getTextContent());
}
}
}
}
}
}
}
return triggerBean;
}
// 往Quartz.xml中加入新的调度任务
// 每次创建都是一个从<job><job-detail></job-detail><trigger></trigger></job>的标签
/**
* 在表单的表单域中的内容全部填充到JobDetailBean,和TriggerBean中,调用该方法就可以将该Job任务保存到xml中<br>
*
*/
public synchronized void createJobElement(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
Node root = document.getDocumentElement();// 获得根节点<quartz>
// 在XML中创建JobDetail相关数据的配置信息
Element job = document.createElement("job");// 创建job标签
Element jobDetail = document.createElement("job-detail");// 创建job-detail标签
Element job_Name = document.createElement("name");// 创建name标签
Text text = document.createTextNode(jobDetailBean.getName());// 创建name的文本
job_Name.appendChild(text);// 将文本添加到name标签中
jobDetail.appendChild(job_Name);// 将name添加为job-detail的子标签
Element job_Group = document.createElement("group");
text = document.createTextNode(jobDetailBean.getGroup());
job_Group.appendChild(text);
jobDetail.appendChild(job_Group);
Element jobclass = document.createElement("job-class");
text = document.createTextNode(jobDetailBean.getJobClass());
jobclass.appendChild(text);
jobDetail.appendChild(jobclass);
Element jobState = document.createElement("job-state");
text = document.createTextNode(jobDetailBean.getJobState());
jobState.appendChild(text);
jobDetail.appendChild(jobState);
Element desc = document.createElement("description");
text = document.createTextNode(StringUtils.isEmpty(jobDetailBean.getDescription()) ? "" : jobDetailBean.getDescription());
desc.appendChild(text);
jobDetail.appendChild(desc);
job.appendChild(jobDetail);// 将job-detail标签添加为job的子标签
// 通过前面已经配置了JobDetail,通过JobDatail中的name和group等于Trigger中的jobname、jobgroup找到相应的job,
// 然后在Job下面创建子标记<cron>或<simple>,再创建Trigger相关数据的配置
Element trigger = document.createElement("trigger");// 创建trigger节点
Element simple = document.createElement("simple");
Element name = document.createElement("name");
text = document.createTextNode(triggerBean.getName());
name.appendChild(text);
simple.appendChild(name);
Element group = document.createElement("group");
text = document.createTextNode(triggerBean.getGroup());
group.appendChild(text);
simple.appendChild(group);
Element jobNameElement = document.createElement("job-name");
text = document.createTextNode(triggerBean.getJobName());
jobNameElement.appendChild(text);
simple.appendChild(jobNameElement);
Element jobGroupElement = document.createElement("job-group");
text = document.createTextNode(triggerBean.getJobGroup());
jobGroupElement.appendChild(text);
simple.appendChild(jobGroupElement);
Element description = document.createElement("description");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getDescription()) ? "" : triggerBean.getDescription());
description.appendChild(text);
simple.appendChild(description);
Element startTime = document.createElement("start-time");
text = document.createTextNode(triggerBean.getStartTime());
startTime.appendChild(text);
simple.appendChild(startTime);
Element priority = document.createElement("priority");
text = document.createTextNode(triggerBean.getPriority());
priority.appendChild(text);
simple.appendChild(priority);
Element repeatCount = document.createElement("repeat-count");
text = document.createTextNode(triggerBean.getRepeatCount());
repeatCount.appendChild(text);
simple.appendChild(repeatCount);
Element repeatInterval = document.createElement("repeat-interval");
text = document.createTextNode(triggerBean.getRepeatInterval());
repeatInterval.appendChild(text);
simple.appendChild(repeatInterval);
Element successTriggered = document.createElement("success-triggered");
text = document.createTextNode(triggerBean.getSuccessTriggered());
successTriggered.appendChild(text);
simple.appendChild(successTriggered);
Element endTime = document.createElement("end-time");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getEndTime()) ? "" : triggerBean.getEndTime());
endTime.appendChild(text);
simple.appendChild(endTime);
Element nextFireTime = document.createElement("next-fire-time");
text = document.createTextNode(StringUtils.isEmpty(triggerBean.getNextFireTime()) ? "" : triggerBean.getNextFireTime());
nextFireTime.appendChild(text);
simple.appendChild(nextFireTime);
Element preFireTime = document.createElement("previous-fire-time");
text = document.createTextNode(triggerBean.getPreviousFireTime());
preFireTime.appendChild(text);
simple.appendChild(preFireTime);
trigger.appendChild(simple);
job.appendChild(trigger);
root.appendChild(job);
doc2XmlFile(getDocument());
}
}