165 lines
4.8 KiB
Java
165 lines
4.8 KiB
Java
package com.wb.tool;
|
||
|
||
import java.sql.Connection;
|
||
import java.sql.ResultSet;
|
||
import java.sql.Statement;
|
||
import java.sql.Types;
|
||
import java.util.Date;
|
||
import java.util.Properties;
|
||
|
||
import com.wb.common.ScriptBuffer;
|
||
import com.wb.task.ScriptProxy;
|
||
import com.wb.util.StringUtil;
|
||
import org.quartz.*;
|
||
import org.quartz.impl.StdSchedulerFactory;
|
||
|
||
import com.wb.common.Var;
|
||
import com.wb.util.DbUtil;
|
||
|
||
public class TaskManager {
|
||
public static Scheduler scheduler;
|
||
|
||
/**
|
||
* 把指定参数的任务加载到任务引擎中。如果相同id的任务已经存在,则重新加载该任务。
|
||
* @param taskId 任务id
|
||
* @param taskName 任务名称
|
||
* @param intervalType 周期类型
|
||
* @param intervalExpress 周期表达式
|
||
* @param className 执行的Java类
|
||
* @param serverScript 执行的服务器端脚本
|
||
* @param beginDate 开始时间
|
||
* @param endDate 结束时间s
|
||
* @throws Exception 加载任务发生异常
|
||
*/
|
||
public static void loadTask(String taskId, String taskName,
|
||
int intervalType, String intervalExpress, String className,
|
||
String serverScript, Date beginDate, Date endDate) throws Exception {
|
||
JobDetail job;
|
||
String express[];
|
||
Trigger trigger = null;
|
||
|
||
// 如果指定id的任务已经存在,删除后重新加载
|
||
deleteTask(taskId);
|
||
if (StringUtil.isEmpty(className)) {
|
||
job = new JobDetail(taskId, Scheduler.DEFAULT_GROUP,
|
||
ScriptProxy.class);
|
||
JobDataMap dataMap = job.getJobDataMap();
|
||
dataMap.put("job.id", "job." + taskId);
|
||
dataMap.put("job.serverScript", serverScript);
|
||
} else
|
||
job = new JobDetail(taskId, Scheduler.DEFAULT_GROUP, Class
|
||
.forName(className));
|
||
job.setDescription(taskName);
|
||
express = StringUtil.split(intervalExpress, ":");
|
||
switch (intervalType) {
|
||
case 0:
|
||
trigger = TriggerUtils.makeSecondlyTrigger(Integer
|
||
.parseInt(express[0]));
|
||
break;
|
||
case 1:
|
||
trigger = TriggerUtils.makeMinutelyTrigger(Integer
|
||
.parseInt(express[0]));
|
||
break;
|
||
case 2:
|
||
trigger = TriggerUtils.makeHourlyTrigger(Integer
|
||
.parseInt(express[0]));
|
||
break;
|
||
case 3:
|
||
trigger = TriggerUtils.makeDailyTrigger(Integer
|
||
.parseInt(express[0]), Integer.parseInt(express[1]));
|
||
break;
|
||
case 4:
|
||
trigger = TriggerUtils.makeWeeklyTrigger(Integer
|
||
.parseInt(express[0]), Integer.parseInt(express[1]),
|
||
Integer.parseInt(express[2]));
|
||
break;
|
||
case 5:
|
||
trigger = TriggerUtils.makeMonthlyTrigger(Integer
|
||
.parseInt(express[0]), Integer.parseInt(express[1]),
|
||
Integer.parseInt(express[2]));
|
||
break;
|
||
}
|
||
trigger.setName(taskId);
|
||
if (beginDate != null)
|
||
trigger.setStartTime(beginDate);
|
||
if (endDate != null)
|
||
trigger.setEndTime(endDate);
|
||
if(scheduler != null) {
|
||
scheduler.scheduleJob(job, trigger);
|
||
}else {
|
||
start();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 删除指定id的任务,如果任务不存在,则该方法无任何效果。
|
||
* @param taskId 任务id
|
||
*/
|
||
public static void deleteTask(String taskId) throws Exception {
|
||
if (scheduler != null)
|
||
if (scheduler.getJobDetail(taskId, Scheduler.DEFAULT_GROUP) != null)
|
||
scheduler.deleteJob(taskId, Scheduler.DEFAULT_GROUP);
|
||
ScriptBuffer.remove("job." + taskId);
|
||
}
|
||
|
||
/**
|
||
* 开始计划任务引擎,加载所有已经配置的计划任务。如果任务已经加载,则重新加载该任务。
|
||
* @throws Exception
|
||
*/
|
||
public static synchronized void start() throws Exception {
|
||
if (!Var.getBool("sys.task.enabled"))
|
||
return;
|
||
if (scheduler == null) {
|
||
StdSchedulerFactory factory = new StdSchedulerFactory();
|
||
Properties props = new Properties();
|
||
props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,
|
||
"org.quartz.simpl.SimpleThreadPool");
|
||
props.put("org.quartz.threadPool.threadCount", Var
|
||
.getString("sys.task.threadCount"));
|
||
factory.initialize(props);
|
||
scheduler = factory.getScheduler();
|
||
scheduler.start();
|
||
} else if (scheduler.isStarted())
|
||
return;
|
||
Connection conn = null;
|
||
Statement st = null;
|
||
ResultSet rs = null;
|
||
|
||
try {
|
||
conn = DbUtil.getConnection();
|
||
st = conn.createStatement();
|
||
rs = st.executeQuery("select * from WB_TASK");
|
||
while (rs.next()) {
|
||
// 停止的任务
|
||
if (rs.getInt("STATUS") == 0)
|
||
continue;
|
||
loadTask(rs.getString("TASK_ID"), rs.getString("TASK_NAME"), rs
|
||
.getInt("INTERVAL_TYPE"), rs
|
||
.getString("INTERVAL_EXPRESS"), rs
|
||
.getString("CLASS_NAME"), (String) DbUtil.getObject(rs,
|
||
"SERVER_SCRIPT", Types.NCLOB), rs
|
||
.getTimestamp("BEGIN_DATE"), rs
|
||
.getTimestamp("END_DATE"));
|
||
}
|
||
} finally {
|
||
DbUtil.close(rs);
|
||
DbUtil.close(st);
|
||
DbUtil.close(conn);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 停止计划任务引擎。
|
||
* @throws Exception
|
||
*/
|
||
public static synchronized void stop() throws Exception {
|
||
if (!Var.getBool("sys.task.enabled"))
|
||
return;
|
||
if (scheduler == null || scheduler.isShutdown())
|
||
return;
|
||
scheduler.shutdown();
|
||
scheduler = null;
|
||
Thread.sleep(Var.getInt("sys.task.stopDelay"));
|
||
}
|
||
}
|