Files
AG-ONE/Webplatform/src/main/java/com/wb/tool/TaskManager.java
2024-07-02 11:40:01 +08:00

165 lines
4.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"));
}
}