项目运行可视化修改定时参数,立即执行任务。
JFinal 、Jboot 框架下的定时任务。
Controller 部分 1.job任务控制器 2 。 job执行类控制器 3 。执行日志控制器
job主控制器
package io.jboot.admin.controller.job;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.google.inject.Inject;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.base.common.RestResult;
import io.jboot.admin.base.rest.datatable.DataTable;
import io.jboot.admin.base.web.base.BaseController;
import io.jboot.admin.jobapi.JobClassParamService;
import io.jboot.admin.jobapi.JobClassService;
import io.jboot.admin.jobapi.JobFactoryService;
import io.jboot.admin.jobapi.JobParamValueService;
import io.jboot.admin.jobapi.QuartzJobService;
import io.jboot.admin.jobentity.QuartzJob;
import io.jboot.admin.jobentity.QuartzJobclass;
import io.jboot.admin.jobentity.QuartzParamValue;
import io.jboot.web.controller.annotation.RequestMapping;
/**
* Job主控制器
*/
@RequestMapping("/quartz/jobs")
public class QuartzJobController extends BaseController {
@Inject
private QuartzJobService quartzJobService;
@Inject
private JobParamValueService jobParamValueService;
@Inject
private JobClassService jobClassService;
@Inject
private JobFactoryService factoryService;
@Inject
private JobClassParamService jobClassParamService;
public void index() {
render("list.html");
}
public void tableData() {
int pageNumber = getParaToInt("pageNumber", 1);
int pageSize = getParaToInt("pageSize", 30);
QuartzJob job = new QuartzJob();
Page<QuartzJob> page = quartzJobService.findPage(job, pageNumber, pageSize);
setAttr("page", page);
renderJson(new DataTable<QuartzJob>(page));
}
public void add() {
/**
* 1拿到所有触发器 2拿到所有执行类 3去新增页面
*/
List<QuartzJobclass> jobclassLsit = jobClassService.findQuartzJobclassAll();
setAttr("jobclassLsit", jobclassLsit);
render("add.html");
}
/**
* 保存或者修改
*/
public void save() {
// 若报错 先开下面的注解,将此处注释掉
QuartzJob job = getBean(QuartzJob.class, "quartzJob");
Map<String, String[]> map = getParaMap();
jobClassParamService.saveClassParam(job.getUids(), job, map);
renderJson(RestResult.buildSuccess("保存成功!"));
}
/**
* 编辑
*/
public void edit() {
String uids = getPara("id");
QuartzJob quartzJob = quartzJobService.findQuartzJobById(uids);
List<QuartzParamValue> values = jobParamValueService.findByJobUids(uids);
setAttr("quartzJob", quartzJob);
setAttr("values", values);
render("edit.html");
}
/**
* 加入job到任务池中
*/
public void addJob() {
JSONObject json = new JSONObject();
String uids = getPara("id");
try {
QuartzJob quartzJob = quartzJobService.findById(uids);
// 获取不到服务
factoryService.addJob(quartzJob);
quartzJob.set("job_state", "0");
quartzJobService.update(quartzJob);
json.put("msg", "任务启动成功!");
renderJson(RestResult.buildSuccess("启动成功!"));
} catch (Exception e) {
e.printStackTrace();
json.put("msg", "任务启动失败!" + e.getMessage());
renderJson(json.toJSONString());
}
}
/**
* 停用
*/
public void stopJobs() {
JSONObject json = new JSONObject();
String uids = getPara("id");
try {
QuartzJob quartzJob = quartzJobService.findById(uids);
factoryService.removeTrigger(quartzJob);
quartzJob.set("job_state", "1");
quartzJobService.update(quartzJob);
json.put("msg", "停用成功!");
renderJson(RestResult.buildSuccess("停用成功!"));
} catch (Exception e) {
json.put("msg", "停用失败!" + e.getMessage());
renderJson(RestResult.buildSuccess("停用失败!"));
}
}
/**
* 执行一次
*/
public void runJobsOnce() {
JSONObject json = new JSONObject();
String uids = getPara("id");
try {
QuartzJob quartzJob = quartzJobService.findById(uids);
factoryService.triggerJob(quartzJob);
json.put("msg", "执行成功!");
renderJson(RestResult.buildSuccess("执行成功!"));
} catch (Exception e) {
json.put("msg", "执行失败!" + e.getMessage());
renderJson(RestResult.buildError("执行失败!"));
}
}
/**
* 刪除数据
*/
public void deleteJob() {
String uids = getPara("id");
QuartzJob quartzJob = quartzJobService.findById(uids);
try {
factoryService.delJob(quartzJob);
renderJson(RestResult.buildSuccess("删除成功"));
} catch (Exception e) {
renderJson(RestResult.buildError("删除失败"));
}
}
}
任务执行类控制器
package io.jboot.admin.controller.job;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.google.inject.Inject;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.base.common.RestResult;
import io.jboot.admin.base.exception.BusinessException;
import io.jboot.admin.base.rest.datatable.DataTable;
import io.jboot.admin.base.web.base.BaseController;
import io.jboot.admin.jobapi.JobClassParamService;
import io.jboot.admin.jobapi.JobClassService;
import io.jboot.admin.jobapi.QuartzJobService;
import io.jboot.admin.jobentity.JobClassParam;
import io.jboot.admin.jobentity.QuartzJob;
import io.jboot.admin.jobentity.QuartzJobclass;
import io.jboot.web.controller.annotation.RequestMapping;
/**
* 任务执行类控制器
*/
@RequestMapping("/quartz/jobclass")
public class QuartzJobclassController extends BaseController {
@Inject
private QuartzJobService quartzJobService;
@Inject
private JobClassService jobClassService;
@Inject
private JobClassParamService jobClassParamService;
/**
* 辅助命名
*/
private int paramscount = 0;
/**
* 存放参数的map
*/
private Map<String, String> params = new HashMap<String, String>();
/**
* 存放参数名称 的 Map
*/
private Map<String, String> paramNamemap = new HashMap<String, String>();
/**
* 辅助命名2
*/
private int paramNamecount = 0;
public void index() {
render("list.html");
}
/**
* 列表
*/
public void tableData() {
int pageNumber = getParaToInt("pageNumber", 1);
int pageSize = getParaToInt("pageSize", 30);
QuartzJobclass job = new QuartzJobclass();
Page<QuartzJobclass> page = jobClassService.findPage(job, pageNumber, pageSize);
setAttr("page", page);
renderJson(new DataTable<QuartzJobclass>(page));
}
public void add() {
render("add.html");
}
/**
* 删除
*/
public void del() {
try {
String uids = getPara("id");
List<QuartzJob> list = quartzJobService.findByWhere(uids);
if (list != null && list.size() > 0) {
throw new BusinessException("操作失败,当前执行类已有对应的job任务。");
} else {
List<JobClassParam> params = jobClassParamService.findByWhere(getPara("id"));
jobClassService.deleteByIdParams(uids, params);
renderJson(RestResult.buildSuccess());
}
} catch (Exception e) {
setAttr("msg", "操作失败" + e.getMessage());
} finally {
}
// list();
}
public void save() {
boolean bool = false;
QuartzJobclass jobclass = getBean(QuartzJobclass.class, "quartzClassJob");
jobclass.setUids(UUID.randomUUID().toString());
// 验证类全名 以及 方法名称
String classAllName = jobclass.get("class_all_name");
String flag = quartzJobService.checkClassAllName(classAllName);
String functionName = jobclass.get("function_name");
if (!"no".equals(flag)) {
flag = quartzJobService.checkFunctionName(functionName, classAllName);
if (!"no".equals(flag)) {
bool = jobClassService.save(jobclass);
}
}
if (bool) {
// 处理子表
// 得到 返回值类型 方法名称 参数类型
Map<String, String> map = quartzJobService.reflectMethod(classAllName, functionName);
String methodsName = map.get("methodName");
String returnTypeName = map.get("returnTypeName");
while (paramscount < map.size() - 2) {
params.put("param" + paramscount, map.get("paramType" + paramscount));
paramscount++;
}
paramscount = 0;
paramNamemap.clear();
// 得到 参数名称
Map<String, String> pmmap = quartzJobService.getParamName(classAllName, methodsName);
while (paramNamecount < pmmap.size()) {
paramNamemap.put("paramName" + paramNamecount, pmmap.get("paramName" + paramNamecount));
paramNamecount++;
}
paramNamecount = 0;
// 保存方法参数
int count = 0;
while (count < params.size()) {
JobClassParam classparam = new JobClassParam();
classparam.setUids(UUID.randomUUID().toString());
classparam.setClassparamState("1");
classparam.setClassparamType("1");
classparam.setClassparamName(paramNamemap.get("paramName" + count).toString());
classparam.setReturnType(returnTypeName);
classparam.setJobclassUids(jobclass.get("uids"));
classparam.setParamType(params.get("param" + count).toString());
bool = jobClassParamService.save(classparam);
count++;
}
}
renderJson(RestResult.buildSuccess("保存成功"));
}
/**
* 查看参数详情
*/
public void view() {
/*
* String jobclassUids = getPara(); StringBuffer sbf = new
* StringBuffer(); sbf.
* append("SELECT CLASSPARAM_NAME AS paramName, PARAM_TYPE AS paramType, "
* ); sbf.append("RETURN_TYPE AS returnType FROM job_class_param ");
* sbf.append("WHERE JOBCLASS_UIDS = '"); sbf.append(jobclassUids +
* "'"); List<JobClassParam> classparamList =
* JobClassParam.dao.find(sbf.toString()); setAttr("classparamList",
* classparamList); render("view.html");
*/
}
}
任务执行日志控制器
package io.jboot.admin.controller.job;
import com.google.inject.Inject;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.base.rest.datatable.DataTable;
import io.jboot.admin.base.web.base.BaseController;
import io.jboot.admin.jobapi.JobLogService;
import io.jboot.admin.jobentity.JobLog;
import io.jboot.web.controller.annotation.RequestMapping;
/**
* jobLogController 执行日志
*
* @Author
*/
@RequestMapping("/quartz/log")
public class JobLogController extends BaseController {
@Inject
private JobLogService jobLogService;
public void index() {
render("list.html");
}
public void tableData() {
int pageNumber = getParaToInt("pageNumber", 1);
int pageSize = getParaToInt("pageSize", 30);
JobLog log = new JobLog();
Page<JobLog> page = jobLogService.findPage(log, pageNumber, pageSize);
renderJson(new DataTable<JobLog>(page));
}
public void view() {
String id = getPara("id");
JobLog jobLog = jobLogService.findById(id);
setAttr("jobLog", jobLog).render("view.html");
}
}
job -Job基类》》 BaseJob.java , 工具类》》GetParamUtil.java 任务执行类》》TimingJob.java
package io.jboot.admin.job;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import com.jfinal.log.Log;
import io.jboot.admin.jobentity.JobLog;
/**
* 所有job的父类<br>
* Job 多线程 StatefulJob 控制并发的<br>
* execute方法通过反射机制执行web界面中配置的方法及参数值,并且执行后写入执行日志
*/
public class BaseJob implements StatefulJob {
protected static final Log logger = Log.getLog(BaseJob.class);
private Class<? extends BaseJob> jobClass;
private DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
public BaseJob() {
jobClass = this.getClass();
}
@Override
@SuppressWarnings("rawtypes")
public void execute(JobExecutionContext arg0) throws JobExecutionException {
JobDataMap map = arg0.getMergedJobDataMap();
String functionName = map.getString("functionName");
JobLog quartzLog = new JobLog();
quartzLog.put("begintimes", format.format(new Date()));
quartzLog.put("content", map.getString("jobContent"));
quartzLog.put("job_content", map.getString("jobContent"));
quartzLog.setUids(UUID.randomUUID().toString());
String zxMess = "执行失败";
String remark = "执行失败";
if (arg0.getNextFireTime() != null) {
quartzLog.put("type", "0");
String nDate = DateFormatUtils.format(arg0.getNextFireTime(), "yyyy-MM-dd HH:mm:ss");
quartzLog.put("nextruntime", nDate);
} else {
quartzLog.put("type", "1");
quartzLog.put("nextruntime", null);
}
quartzLog.put("jobuids", map.getString("jobUids"));
try {
// 根据job class和方法名称获得对应方法的参数个数,及参数名称,参数类型
String time = format.format(new Date());
zxMess = "执行" + jobClass.getCanonicalName() + "类中的" + functionName + "方法;参数值分别为:";
remark = "[" + time + "]执行\n" + jobClass.getCanonicalName() + "类中的\n" + functionName + "方法;参数值分别为:\n";
Map<String, String> paramsMap = GetParamUtil.getParamsMap(jobClass.getCanonicalName(), functionName);
Class[] paramsClass = new Class[Integer.parseInt(paramsMap.get("paramsNum").toString())];
Object[] paramsValueObj = new Object[Integer.parseInt(paramsMap.get("paramsNum").toString())];
paramsMap.remove("paramsNum");
int i = 0;
for (String str : paramsMap.keySet()) {
String paramsType = paramsMap.get(str);
Class<?> c = Class.forName(paramsType);
paramsClass[i] = c;
// Object obj=map.get(str);
Object obj = null;
if (paramsType.equals("java.lang.Integer") || paramsType.equals("java.lang.Byte")
|| paramsType.equals("java.lang.Boolean") || paramsType.equals("java.lang.Short")
|| paramsType.equals("java.lang.Long") || paramsType.equals("java.lang.Float")
|| paramsType.equals("java.lang.Double")) {
Method castMethod = c.getDeclaredMethod("valueOf", String.class);
obj = castMethod.invoke(null, map.get(str).toString());
} else {
if (paramsType.equals("java.lang.Character") || paramsType.equals("java.math.BigDecimal")) {
Constructor<?> intArgsConstructor = c.getConstructor(new Class[] { String.class });
obj = intArgsConstructor.newInstance(new Object[] { map.get(str).toString() });
} else {
obj = c.newInstance();
obj = map.get(str);
}
}
zxMess += " " + str + ":" + obj;
remark += " " + str + ":" + obj + "\n";
paramsValueObj[i] = obj;
i++;
}
quartzLog.put("job_classandfunction", zxMess);
Method method = jobClass.getDeclaredMethod(functionName, paramsClass);
method.invoke(jobClass.newInstance(), paramsValueObj);
quartzLog.setEndtimes(format.format(new Date()));
quartzLog.setState("1");// 执行成功
String ip = getLocalIP();
if (ip != null && !"".equals(ip)) {
quartzLog.put("run_ip", ip);
}
quartzLog.put("remark", remark + " 执行成功!");
logger.debug(remark + " 执行成功!");
} catch (Exception e) {
quartzLog.setJobClassandfunction(zxMess);
quartzLog.setEndtimes(format.format(new Date()));
quartzLog.put("state", "0");// 执行失败
String ip = getLocalIP();
if (ip != null && !"".equals(ip)) {
quartzLog.put("run_ip", ip);
}
logger.error("\n" + remark + "\n执行失败!");
logger.error(e.getMessage(), e);
quartzLog.put("remark", remark + " 执行失败!");
} finally {
quartzLog.save();
// logDAO.saveOrUpdate(quartzLog);
}
}
/**
* 判断当前系统是否windows
*
* @return
*/
public static boolean isWindowsOS() {
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
if (osName.toLowerCase().indexOf("windows") > -1) {
isWindowsOS = true;
}
return isWindowsOS;
}
/**
* 取当前系统站点本地地址 linux下 和 window下可用 add by RWW
*
* @return
*/
public static String getLocalIP() {
String sIP = "";
InetAddress ip = null;
try {
// 如果是Windows操作系统
if (isWindowsOS()) {
ip = InetAddress.getLocalHost();
} else {// 如果是Linux操作系统
boolean bFindIP = false;
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
if (bFindIP) {
break;
}
NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
// ----------特定情况,可以考虑用ni.getName判断
// 遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() // 127.开头的都是lookback地址
&& ip.getHostAddress().indexOf(":") == -1) {
bFindIP = true;
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (null != ip) {
sIP = ip.getHostAddress();
}
return sIP;
}
public static String getStackMsg(Throwable e) {
StringBuffer sb = new StringBuffer(e.getClass().getName() + "\n");
StackTraceElement[] stackArray = e.getStackTrace();
for (int i = 0; i < stackArray.length; i++) {
StackTraceElement element = stackArray[i];
sb.append("\tat" + element.toString() + "\n");
}
return sb.toString();
}
}
工具类 GetParamUtil.java
package io.jboot.admin.job;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import com.jfinal.log.Log;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
/**
* 工具类: 通过类全名 方法名称 得到参数个数 参数名称
*
* @author 袁旭云
*
*/
public class GetParamUtil {
protected static final Log logger = Log.getLog(GetParamUtil.class);
/**
* 枚举存放基本数据类对应的整形
*
* public enum DataTypes { Integer, Byte, Boolean, Short, Character, Long,
* Float, Double }
*/
/**
* 通过反射 取得类里面的方法的返回值 参数类型
*
* @param classFullName
* 类全名(包扩包名)
* @param methodName
* 方法名称
* @return map 包含方法名 返回值类型 参数 的 map
*/
public static Map<String, String> reflectMethod(String classFullName, String methodName) {
int count = 0;
Map<String, String> map = null;
// 类全名存在
if (checkClassAllName(classFullName).equals("ok")) {
// 方法名存在
if (checkFunctionName(classFullName, methodName).equals("ok")) {
try {
map = new HashMap<String, String>();
// 先清空
map.clear();
Class<?> cls = Class.forName(classFullName);
// 获取自定义的方法 得到的是一个数组
Method[] md = cls.getDeclaredMethods();
for (Method m : md) {
// 获取参数类型
Class<?>[] cl = m.getParameterTypes();
// 根据指定方法名得到其参数等信息
if (m.getName().equals(methodName)) {
// 方法名称
map.put("methodName", m.getName());
// 返回值类型
map.put("returnTypeName", m.getReturnType().getName());
for (Class<?> cs : cl) {
// 参数类型
map.put("paramType" + count, cs.getName());
count++;
}
} // end if
} // end for
} catch (ClassNotFoundException e) {
logger.error("java.lang.ClassNotFoundException:" + e.getMessage());
}
}
if (checkFunctionName(classFullName, methodName).equals("no")) {
logger.debug("找不到自定义的方法!");
}
}
return map;
}
/**
* 使用javaassist的反射方法获取方法的参数名
*
* @param classFullName
* 类全名(包扩包名)
* @param methodName
* 方法名称
* @return paramNamemap 包含参数名称 的 Map
*/
public static Map<String, String> getParamName(String classFullName, String methodName) {
Map<String, String> paramNamemap = null;
Class<?> clazz;
try {
paramNamemap = new LinkedHashMap<String, String>();
paramNamemap.clear();// 先清空
clazz = Class.forName(classFullName);
ClassPool pool = ClassPool.getDefault();
// ClassPool pool = ClassPool.getDefault();
// 注意 因为是web应用 此处必须这么写 否侧 会找不到 classFullName 报异常
// 参见
// http://topic.csdn.net/u/20110318/17/924ee7a8-2abf-42db-ae0d-01509554efeb.html
ClassClassPath classPath = new ClassClassPath(clazz);
pool.insertClassPath(classPath);
// pool.insertClassPath(new ClassClassPath(clazz));
// System.out.println("this.getClass()"+this.getClass());
CtClass cc = pool.get(clazz.getName());
CtMethod cm = cc.getDeclaredMethod(methodName);
// 使用javaassist的反射方法获取方法的参数名
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
.getAttribute(LocalVariableAttribute.tag);
if (attr == null) {
// exception 此处暂时 不处理
}
String[] paramNames = new String[cm.getParameterTypes().length];
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramNames.length; i++)
paramNames[i] = attr.variableName(i + pos);
for (int i = 0; i < paramNames.length; i++) {
paramNamemap.put("paramName" + i, paramNames[i]);
}
// spring 方式
// LocalVariableTableParameterNameDiscoverer u = new
// LocalVariableTableParameterNameDiscoverer();
// clazz = Class.forName(classFullName);
// Method[] methods = clazz.getDeclaredMethods();
// Method method = null;
// for(Method m : methods) {
// if(m.getName().equals(methodName)){
// method = m;
// break;
// }
// }
//
// String[] params = u.getParameterNames(method);
// for (int i = 0; i < params.length; i++) {
// paramNamemap.put("paramName" + i, params[i]);
// }
} catch (Exception e) {
e.printStackTrace();
logger.error("getParamName ERR:" + e.getMessage());
}
return paramNamemap;
}
/**
* 根据 类全名(包括包名)和 方法名称 返回 参数个数 参数名称 参数类型 paramsNum 参数个数 params +数字 参数
*
* @param beanName
* 类全名(包括包名)
* @param functionName
* 方法名称
* @return map 参数个数 参数名称 参数类型 的 map
*/
public static Map<String, String> getParamsMap(String beanName, String functionName) {
Map<String, String> paramsMap = null;
Map<String, String> maps = reflectMethod(beanName, functionName);
Map<String, String> map = getParamName(beanName, functionName);
// System.out.println("方法名称:"+maps.get("methodName"));
// System.out.println("返回值类型:"+maps.get("returnTypeName"));
// int paramscount =0;
// while(paramscount < maps.size()-2){
// System.out.print("参数名称"+map.get("paramName"+paramscount));
// System.out.println("参数类型"+maps.get("paramType"+paramscount));
// paramscount++;
// }
if (maps != null) {
paramsMap = new LinkedHashMap<String, String>();
// 参数个数
paramsMap.put("paramsNum", String.valueOf(maps.size() - 2));
int paramscounts = 0;
while (paramscounts < maps.size() - 2) {
// 基本类型转换为封转类型
if (maps.get("paramType" + paramscounts).toString().equals("int")) {
maps.put("paramType" + paramscounts, "java.lang.Integer");
}
if (maps.get("paramType" + paramscounts).toString().equals("byte")) {
maps.put("paramType" + paramscounts, "java.lang.Byte");
}
if (maps.get("paramType" + paramscounts).toString().equals("boolean")) {
maps.put("paramType" + paramscounts, "java.lang.Boolean");
}
if (maps.get("paramType" + paramscounts).toString().equals("short")) {
maps.put("paramType" + paramscounts, "java.lang.Short");
}
if (maps.get("paramType" + paramscounts).toString().equals("char")) {
maps.put("paramType" + paramscounts, "java.lang.Character");
}
if (maps.get("paramType" + paramscounts).toString().equals("long")) {
maps.put("paramType" + paramscounts, "java.lang.Long");
}
if (maps.get("paramType" + paramscounts).toString().equals("float")) {
maps.put("paramType" + paramscounts, "java.lang.Float");
}
if (maps.get("paramType" + paramscounts).toString().equals("double")) {
maps.put("paramType" + paramscounts, "java.lang.Double");
}
paramsMap.put(map.get("paramName" + paramscounts), maps.get("paramType" + paramscounts));
paramscounts++;
}
}
return paramsMap;
}
/**
* 方法是否存在
*
* @param classFullName
* 类全名
* @param methodName
* 方法名
* @return
* @return String 返回 ok or no
*/
public static String checkFunctionName(String classFullName, String methodName) {
String flag = "no";
Class<?> cls;
try {
// 先清空
cls = Class.forName(classFullName);
// 获取自定义的方法 得到的是一个数组
Method[] md = cls.getDeclaredMethods();
for (Method m : md) {
// 根据指定方法名得到其参数等信息
if (m.getName().equals(methodName)) {
flag = "ok";
}
}
} catch (ClassNotFoundException e) {
logger.error("checkFunctionName ERR:" + e.getMessage());
}
return flag;
}
/**
* 检测类全名是否存在
*
* @param classAllName
* 类全名
* @return String 返回 ok or no
*/
public static String checkClassAllName(String classAllName) {
String flag = "no";
try {
Class<?> cls = Class.forName(classAllName);
if (cls != null) {
flag = "ok";
}
} catch (ClassNotFoundException e) {
logger.error("checkClassAllName ERR:" + e.getMessage());
}
return flag;
}
public static void main(String[] args) {
// getParamName("com.sgepit.framework.base.quartzWeb.job.TestJob",
// "hello");
// byte java.lang.Byte
// boolean java.lang.Boolean
// short java.lang.Short
// char java.lang.Character
// int java.lang.Integer
// long java.lang.Long
// float java.lang.Float
// double java.lang.Double
}
}
任务执行类 》》TimingJob.java
package io.jboot.admin.job;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.concurrent.DelayQueue;
import org.apache.commons.lang3.time.DateUtils;
import com.hnzh.wmall.service.api.CommodityActivityService;
import com.hnzh.wmall.service.api.CommodityDiscountService;
import com.hnzh.wmall.service.api.CommodityEvaluateService;
import com.hnzh.wmall.service.api.IndentCommodityService;
import com.hnzh.wmall.service.api.IndentService;
import com.hnzh.wmall.service.entity.CommodityDiscount;
import com.hnzh.wmall.service.entity.CommodityEvaluate;
import com.hnzh.wmall.service.entity.Indent;
import com.hnzh.wmall.service.entity.IndentCommodity;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import io.jboot.Jboot;
import io.jboot.admin.base.common.ServiceConst;
import io.jboot.core.rpc.Jbootrpc;
import io.jboot.core.rpc.JbootrpcServiceConfig;
/**
* 任务执行类
*/
public class TimingJob extends BaseJob {
protected static final Log logger = Log.getLog(TimingJob.class);
// 初始化订单延时队列计数器
private static int counter = 0;
private static DelayQueue<TaskEntity> queue = new DelayQueue<TaskEntity>();
public TimingJob() {
new Thread(new ExecuteClass(queue)).start();
}
public String hello() {
System.out.println("hello");
return "";
}
/**
* 发货时间 后minutes分没有收货 则自动收货
*
* @return
*/
public String delivery(String minutes) {
Jbootrpc jbootrpc = Jboot.me().getRpc();
JbootrpcServiceConfig serviceConfig = new JbootrpcServiceConfig();
serviceConfig.setGroup(ServiceConst.SERVICE_WMALL);
IndentService indentService = jbootrpc.serviceObtain(IndentService.class, serviceConfig);
Date startShipTime = DateUtils.addMinutes(new Date(), 0 - Integer.parseInt(minutes));
Indent indentShip = new Indent();
indentShip.setIsPay(1);
indentShip.setIsReceipt(1);
indentShip.setIsShip(0);
indentShip.setDelFlag("0");
indentShip.setShipTime(startShipTime);
List<Indent> indentListShip = indentService.getWaitIsPay(null, indentShip);
for (Indent idents : indentListShip) {
idents.setIsShip(1);
idents.setUpdateTime(new Date());
idents.setNotes("自动收货成功,待评价");
if (!indentService.update(idents)) {
logger.debug("自动收货修改失败>>ID:" + idents.getId());
}
}
return "success";
}
/**
* 收货成功 后minutes后默认好评
* (业务逻辑仅供参考),没有使用延时队列,因此默认好评时间会有一些误差
* @return
*/
public String comments(String minutes) {
Jbootrpc jbootrpc = Jboot.me().getRpc();
JbootrpcServiceConfig serviceConfig = new JbootrpcServiceConfig();
serviceConfig.setGroup(ServiceConst.SERVICE_WMALL);
IndentService indentService = jbootrpc.serviceObtain(IndentService.class, serviceConfig);
CommodityEvaluateService commentService = jbootrpc.serviceObtain(CommodityEvaluateService.class, serviceConfig);
IndentCommodityService indentCommodityService = jbootrpc.serviceObtain(IndentCommodityService.class,
serviceConfig);
Date startSignTime = DateUtils.addMinutes(new Date(), 0 - Integer.parseInt(minutes));
Indent indentTmp = new Indent();
indentTmp.setIsPay(1);
indentTmp.setIsReceipt(1);
indentTmp.setIsShip(1);
indentTmp.setIndentDelflag("2");
indentTmp.setDelFlag("0");
indentTmp.setUpdateTime(startSignTime);
List<Indent> indentListEvaluation = indentService.getWaitIsPay(null, indentTmp);
for (Indent indent : indentListEvaluation) {
CommodityEvaluate comment = new CommodityEvaluate();
List<IndentCommodity> indentCommodityList = indentCommodityService.getNumber(indent.getNumber());
for (IndentCommodity indentCommoditys : indentCommodityList) {
comment.setCommodityId(indentCommoditys.getCommodityId());
comment.setIndentCommodityId(indentCommoditys.getId());
comment.setContent("此用户没有填写评价");
comment.setUserId(indent.getUserId());
comment.setCreatedTime(new Date());
indentCommoditys.setDelFlag("1");
indentCommoditys.setUpdateTime(new Date());
indent.setNotes("自动好评成功");
indent.setUpdateTime(new Date());
if (!commentService.saveCommodityAndIndentCommodity(comment, indentCommoditys, indent)) {
logger.debug("自动好评失败>>订单号:" + indent.getNumber());
}
}
}
return "success";
}
/**
* 订单超时定时任务,若超时,则将该订单数据更新(业务逻辑仅供参考)
* 该方法使用了延时队列,我的另一篇文章写的有延时队列的
* @param minutes
* @return
*/
public synchronized String indentTimeout(String minutes) {
Jbootrpc jbootrpc = Jboot.me().getRpc();
JbootrpcServiceConfig serviceConfig = new JbootrpcServiceConfig();
serviceConfig.setGroup(ServiceConst.SERVICE_WMALL);
IndentCommodityService indentCommodityService = jbootrpc.serviceObtain(IndentCommodityService.class,
serviceConfig);
// 查询出所有未支付订单
List<IndentCommodity> commodities = indentCommodityService.findIndentCommodity(null);
for (int i = 0; i < commodities.size(); i++) {
counter++;
// 延时执行时间 转为毫秒
long time = Integer.parseInt(minutes) * 60 * 1000;
long delayTime = time - (new Date().getTime() - commodities.get(i).getCreateTime().getTime());
TaskEntity te = null;
if (delayTime < 0) {
logger.debug("超过" + minutes + "分钟未加入到队列,订单号>>>" + commodities.get(i).getIndentNumber() + ",立即加入队列");
te = new TaskEntity(counter, commodities.get(i), 0);
} else {
te = new TaskEntity(counter, commodities.get(i), delayTime);
// 检测该订单对象是否在延时队列中,若存在不做处理
IndentCommodity indentCommodity = Jboot.me().getCache().get("DelayExecuteClass",
"executeClass" + commodities.get(i).getIndentNumber());
if (indentCommodity != null) {
continue;
}
}
// 将需处理的订单对象加入到缓存内
Jboot.me().getCache().put("DelayExecuteClass", "executeClass" + commodities.get(i).getIndentNumber(),
commodities.get(i));
// 将需处理的订单对象加入到延时队列中
queue.offer(te);
}
return "success";
}
}
job API
package io.jboot.admin.jobapi;
import java.util.List;
import java.util.Map;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.JobClassParam;
import io.jboot.admin.jobentity.QuartzJob;
public interface JobClassParamService {
public boolean saveClassParam(String id,QuartzJob quartzJob,Map<String,String[]> map);
public List<JobClassParam> findByWhere(String uids);
public List<JobClassParam> findByJobclassUids(String jobclassUids);
/**
* find model by primary key
*
* @param id
* @return
*/
public JobClassParam findById(Object id);
/**
* find all model
*
* @return all <JobClassParam
*/
public List<JobClassParam> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteById(Object id);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(JobClassParam model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(JobClassParam model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(JobClassParam model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(JobClassParam model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
package io.jboot.admin.jobapi;
import java.util.List;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.JobClassParam;
import io.jboot.admin.jobentity.QuartzJobclass;
public interface JobClassService {
/**
* 分页查询
* @param quartzJobclass
* @param pageNumber
* @param pageSize
* @return
*/
public Page<QuartzJobclass> findPage(QuartzJobclass quartzJobclass,int pageNumber,int pageSize);
/**
* 获取执行类
* @return
*/
public List<QuartzJobclass> findQuartzJobclassAll();
/**
* find model by primary key
*
* @param id
* @return
*/
public QuartzJobclass findById(Object id);
/**
* find all model
*
* @return all <JobClass
*/
public List<QuartzJobclass> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteByIdParams(Object id,List<JobClassParam> params);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(QuartzJobclass model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(QuartzJobclass model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(QuartzJobclass model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(QuartzJobclass model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
package io.jboot.admin.jobapi;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import io.jboot.admin.jobentity.QuartzJob;
/**
* Created by zhangcy on 2018/8/20.
*/
public interface JobFactoryService {
public boolean delJob(QuartzJob quartzJob);
/**
* 根据job添加任务到任务池中
*
* @param job
* @throws Exception
*/
public void addJob(QuartzJob job) throws Exception;
/**
* 获取所有的任务名称
*
* @return
* @throws SchedulerException
*/
public String[] getJobNames() throws Exception;
/**
* 将任务添加到job执行池中
*/
public void addJobList();
/**
* 根据job停止触发器
*
* @param job
* 传入的job任务
*/
public void parseTrigger(QuartzJob job);
/**
* 移除触发器
*
* @param job
* 传入的job任务
* @return
*/
public boolean removeTrigger(QuartzJob job);
/**
* 重启触发器
*
* @param job
* 传入的job任务
*/
public void resumeTrigger(QuartzJob job);
/**
* 执行触发器
*
* @param job
* @return
*/
public boolean triggerJob(QuartzJob job);
/**
* 获得Scheduler对象
*
* @return
*/
public Scheduler getScheduler();
/**
* 更加job删除任务相关
*
* @param job
*/
public void deleteQuartzQorkByJob(QuartzJob job);
/**
* 删除关联业务时级联删除规业务对应对应的任务调度数据
*
* @param uids
* 业务主键
* @param type
* 标示 值为 0 1 <br>
* 如果时间规则固定公用的不需要删除掉 那么type的值请传入 0 <br>
* 如果时间规则跟随业务特定生成的只对当前job有用可以考虑删掉 那么type的值请传入 1
*/
public void doCascadeJobDelete(String uids, String type);
}
package io.jboot.admin.jobapi;
import java.util.List;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.JobLog;
public interface JobLogService {
/**
* 分页查询
* @param log
* @param pageNumber
* @param pageSize
* @return
*/
public Page<JobLog> findPage(JobLog log,int pageNumber,int pageSize);
/**
* find model by primary key
*
* @param id
* @return
*/
public JobLog findById(Object id);
/**
* find all model
*
* @return all <JobLog
*/
public List<JobLog> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteById(Object id);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(JobLog model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(JobLog model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(JobLog model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(JobLog model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
package io.jboot.admin.jobapi;
import java.util.List;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.QuartzParamValue;
public interface JobParamValueService {
/**
* 根据JobUids查询
* @return
*/
public List<QuartzParamValue> findByJobUids(String uids);
/**
* find model by primary jobUids
*
* @param jobUids
* @return
*/
public List<QuartzParamValue> findByJobId(String jobUids);
/**
* find model by primary key
*
* @param id
* @return
*/
public QuartzParamValue findById(Object id);
/**
* find all model
*
* @return all <JobParamValue
*/
public List<QuartzParamValue> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteById(Object id);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(QuartzParamValue model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(QuartzParamValue model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(QuartzParamValue model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(QuartzParamValue model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
package io.jboot.admin.jobapi;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.Job;
import java.util.List;
public interface JobService {
/**
* 分页查询
* @param job
* @param pageNumber
* @param pageSize
* @return
*/
public Page<Job> findPage(Job job,int pageNumber,int pageSize);
/**
* find model by primary key
*
* @param id
* @return
*/
public Job findById(Object id);
/**
* find all model
*
* @return all <Job
*/
public List<Job> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteById(Object id);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(Job model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(Job model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(Job model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(Job model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
package io.jboot.admin.jobapi;
import java.util.List;
import java.util.Map;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobentity.QuartzJob;
public interface QuartzJobService {
/**
* 使用javaassist的反射方法获取方法的参数名
*
* @param classFullName
* @param methodName
* @return paramNamemap 包含参数名称 的 Map
*/
public Map<String, String> getParamName(String classAllName, String methodsName);
/**
* 通过反射 取得类里面的方法的返回值 参数类型
*
* @param classFullName
* @param methodName
* @return map 包含方法名 返回值类型 参数 的 map
*/
public Map<String, String> reflectMethod(String classAllName, String functionName);
/**
* 检测方法是否存在
*
* @param functionName
* @param classAllName
* @return
*/
public String checkFunctionName(String functionName, String classAllName);
/**
* 检测类是否存在
*
* @param classAllName
* @return
*/
public String checkClassAllName(String classAllName);
/**
* 查询当前执行类是否已有任务
*
* @return
*/
public List<QuartzJob> findByWhere(String uids);
public List<QuartzJob> findByState(String state);
/**
*
* @return
*/
public QuartzJob findQuartzJobById(String uids);
/**
* 分页查询
*
* @param job
* @param pageNumber
* @param pageSize
* @return
*/
public Page<QuartzJob> findPage(QuartzJob job, int pageNumber, int pageSize);
/**
* find model by primary key
*
* @param id
* @return
*/
public QuartzJob findById(Object id);
/**
* find all model
*
* @return all <QuartzJob
*/
public List<QuartzJob> findAll();
/**
* delete model by primary key
*
* @param id
* @return success
*/
public boolean deleteById(Object id);
/**
* delete model
*
* @param model
* @return
*/
public boolean delete(QuartzJob model);
/**
* save model to database
*
* @param model
* @return
*/
public boolean save(QuartzJob model);
/**
* save or update model
*
* @param model
* @return if save or update success
*/
public boolean saveOrUpdate(QuartzJob model);
/**
* update data model
*
* @param model
* @return
*/
public boolean update(QuartzJob model);
/**
* 分页
*
* @param page
* @param pageSize
* @return
*/
public Page<? extends Model> paginate(int page, int pageSize);
public void join(Page<? extends Model> page, String joinOnField);
public void join(Page<? extends Model> page, String joinOnField, String[] attrs);
public void join(Page<? extends Model> page, String joinOnField, String joinName);
public void join(Page<? extends Model> page, String joinOnField, String joinName, String[] attrs);
public void join(List<? extends Model> models, String joinOnField);
public void join(List<? extends Model> models, String joinOnField, String[] attrs);
public void join(List<? extends Model> models, String joinOnField, String joinName);
public void join(List<? extends Model> models, String joinOnField, String joinName, String[] attrs);
public void join(Model model, String joinOnField);
public void join(Model model, String joinOnField, String[] attrs);
public void join(Model model, String joinOnField, String joinName);
public void join(Model model, String joinOnField, String joinName, String[] attrs);
public void keep(Model model, String... attrs);
public void keep(List<? extends Model> models, String... attrs);
}
》》》 impl
package io.jboot.admin.jobapi.impl;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.inject.Singleton;
import com.google.inject.Inject;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import io.jboot.admin.jobapi.JobClassParamService;
import io.jboot.admin.jobapi.QuartzJobService;
import io.jboot.admin.jobentity.JobClassParam;
import io.jboot.admin.jobentity.QuartzJob;
import io.jboot.admin.jobentity.QuartzParamValue;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
import io.jboot.utils.StrUtils;
@Bean
@Singleton
public class JobClassParamServiceImpl extends JbootServiceBase<JobClassParam> implements JobClassParamService {
@Inject
private JobClassParamService jobClassParamService;
@Inject
private QuartzJobService quartzJobService;
@Override
public List<JobClassParam> findByJobclassUids(String jobclassUids) {
String sql = "select * from job_class_param where JOBCLASS_UIDS = '" + jobclassUids + "' ";
return DAO.find(sql);
}
public boolean save(String id) {
return false;
}
@Override
public List<JobClassParam> findByWhere(String uids) {
String sql = "select * from job_class_param where jobclass_uids = '" + uids + "'";
return DAO.find(sql);
}
@Override
public boolean saveClassParam(String id, QuartzJob quartzJob, Map<String, String[]> map) {
// 保持事物一致性
Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
String uids = id;
if (!StrUtils.isBlank(uids)) {
// 更新 执行类的参数值
String uidsArr[] = map.get("paramValue.uids");
String valueArr[] = map.get("paramValue.paramvalue_value");
if (uidsArr != null) {
for (int i = 0; i < uidsArr.length; i++) {
QuartzParamValue paramValue = new QuartzParamValue();
paramValue.setUids(uidsArr[i]);
paramValue.setParamvalueValue(valueArr[i]);
paramValue.update();
}
}
quartzJobService.update(quartzJob);
} else {
if (StrUtils.isNotBlank(quartzJob.getUids())) {
quartzJobService.update(quartzJob);
} else {
QuartzJob job = quartzJob;
uids = UUID.randomUUID().toString();
job.put("uids", uids);
job.put("create_date", new Date());
job.save();
// 开始保存 执行类的参数值
String jobclassUids = job.get("jobclass_uids");
// 获取任务执行类的参数
List<JobClassParam> classparamList = jobClassParamService.findByJobclassUids(jobclassUids);
for (int i = 0, k = classparamList.size(); i < k; i++) {
// 执行类的参数值 初始数据
QuartzParamValue paramValue = new QuartzParamValue();
uids = UUID.randomUUID().toString();
paramValue.put("uids", uids);
paramValue.put("paramvalue_name", classparamList.get(i).get("classparam_name"));
paramValue.put("param_uids", classparamList.get(i).get("uids"));
paramValue.put("job_uids", job.get("uids"));
paramValue.put("state", "1");
paramValue.put("paramvalue_value", "0");
paramValue.save();
}
}
}
return true;
}
});
return false;
}
}
package io.jboot.admin.jobapi.impl;
import java.sql.SQLException;
import java.util.List;
import javax.inject.Singleton;
import com.google.inject.Inject;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobapi.JobClassParamService;
import io.jboot.admin.jobapi.JobClassService;
import io.jboot.admin.jobentity.JobClassParam;
import io.jboot.admin.jobentity.QuartzJobclass;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
@Bean
@Singleton
public class JobClassServiceImpl extends JbootServiceBase<QuartzJobclass> implements JobClassService {
@Inject
private JobClassParamService jobClassParamService;
@Override
public List<QuartzJobclass> findQuartzJobclassAll() {
String cSql = "select UIDS as uids,name from job_class";
return DAO.find(cSql);
}
@Override
public Page<QuartzJobclass> findPage(QuartzJobclass quartzJobclass, int pageNumber, int pageSize) {
Page<QuartzJobclass> page = DAO.paginate(pageNumber, pageSize, "SELECT uids, name, class_all_name AS class_all_name, function_name AS function_name, remark ","FROM job_class t");
return page;
}
@Override
public boolean deleteByIdParams(Object id,List<JobClassParam> params) {
Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
for (JobClassParam classParam : params) {
jobClassParamService.delete(classParam);
}
deleteById(id);
return true;
}
});
return true;
}
}
package io.jboot.admin.jobapi.impl;
import java.sql.SQLException;
import java.util.List;
import java.util.TimeZone;
import javax.inject.Singleton;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import com.google.inject.Inject;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import io.jboot.admin.jobapi.JobClassService;
import io.jboot.admin.jobapi.JobFactoryService;
import io.jboot.admin.jobapi.JobParamValueService;
import io.jboot.admin.jobapi.QuartzJobService;
import io.jboot.admin.jobentity.QuartzJob;
import io.jboot.admin.jobentity.QuartzJobclass;
import io.jboot.admin.jobentity.QuartzParamValue;
import io.jboot.aop.annotation.Bean;
@Bean
@Singleton
public class JobFactoryServiceImpl implements JobFactoryService {
protected static final Log logger = Log.getLog(JobFactoryServiceImpl.class);
@Inject
private JobClassService jobClassService;
@Inject
private QuartzJobService jobService;
@Inject
private JobParamValueService paramValueService;
private Scheduler scheduler = null;
public JobFactoryServiceImpl() {
try {
if (scheduler == null) {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
scheduler = schedulerFactory.getScheduler();
}
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void addJob(QuartzJob job) throws Exception {
String jobclassUids = job.get("jobclass_uids");
String jobUids = job.get("uids") + "";
QuartzJobclass runClass = jobClassService.findById(jobclassUids);
// 先查找是否已经存在
JobDetail detail;
try {
detail = scheduler.getJobDetail(jobUids, Scheduler.DEFAULT_GROUP);
if (detail == null) {// 任务不存在
Class<?> JobClass = null;
// 若不存在如下处理
String classAllname = runClass.get("class_all_name");
JobClass = Class.forName(classAllname);
// 1、创建JobDetial对象
JobDetail jobDetail = new JobDetail();
jobDetail.setJobClass(JobClass);
jobDetail.setName(jobUids);
jobDetail.setGroup(Scheduler.DEFAULT_GROUP);
// 设置执行类的参数值
// ******
List<QuartzParamValue> paramValues = paramValueService.findByJobId(jobUids);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("functionName", runClass.get("function_name"));
jobDataMap.put("jobContent", job.get("job_content"));
jobDataMap.put("jobUids", jobUids);
if (paramValues != null && paramValues.size() > 0) {
for (QuartzParamValue value : paramValues) {
String paramName = value.get("paramvalue_name");
String paramValue = value.get("paramvalue_value");
jobDataMap.put(paramName, paramValue);
}
}
jobDetail.setJobDataMap(jobDataMap);
// 2、创建Trigger对象
CronTrigger trigger = new CronTrigger(jobUids, Scheduler.DEFAULT_GROUP);
// 设置触发时间
TimeZone tz = TimeZone.getTimeZone("Etc/GMT-8");
trigger.setTimeZone(tz);
// 获得时间规则
trigger.setCronExpression(job.get("to_quartztimes") + "");
scheduler.scheduleJob(jobDetail, trigger);
if (scheduler.isShutdown()) {
scheduler.start();
}
} else {
// 如果任务已经存在,重启任务
resumeTrigger(job);
}
} catch (Exception e) {
e.printStackTrace();
logger.debug("名为:" + job.get("job_name") + " 的JOB初始化加载触发器失败!此job可能不执行!");
logger.error("error:" + e.getStackTrace());
}
}
@Override
public String[] getJobNames() throws SchedulerException {
return scheduler.getJobNames(Scheduler.DEFAULT_GROUP);
}
@Override
public void addJobList() {
// 查询出所有启用状态的job
List<QuartzJob> jobs = jobService.findByState("0");
try {
if (jobs != null) {
for (QuartzJob job : jobs) {
this.addJob(job);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void parseTrigger(QuartzJob job) {
logger.debug("***************停止触发器***************");
try {
scheduler.pauseTrigger(job.get("uids") + "", Scheduler.DEFAULT_GROUP);
} catch (Exception e) {
e.printStackTrace();
logger.error("error:" + e.getStackTrace());
}
}
@Override
public boolean removeTrigger(QuartzJob job) {
logger.debug("***************移除触发器***************");
try {
parseTrigger(job);
return scheduler.unscheduleJob(job.get("uids") + "", Scheduler.DEFAULT_GROUP);
} catch (Exception e) {
e.printStackTrace();
logger.error("error" + e.getStackTrace());
}
return false;
}
@Override
public void resumeTrigger(QuartzJob job) {
logger.debug("***************重启触发器***************");
try {
scheduler.resumeTrigger(job.get("uids") + "", Scheduler.DEFAULT_GROUP);
} catch (Exception e) {
e.printStackTrace();
logger.error("error" + e.getStackTrace());
}
}
@Override
public boolean triggerJob(QuartzJob job) {
try {
scheduler.triggerJob(job.get("uids") + "", Scheduler.DEFAULT_GROUP);
return true;
} catch (SchedulerException e) {
e.printStackTrace();
logger.error("error" + e.getStackTrace());
}
return false;
}
@Override
public Scheduler getScheduler() {
return scheduler;
}
@Override
public void deleteQuartzQorkByJob(QuartzJob job) {
logger.debug("***************删除job数据***************");
this.removeTrigger(job);
// 先删除参数列表
List<QuartzParamValue> paramValues = paramValueService.findByJobId(job.get("uids"));
for (QuartzParamValue paramValue : paramValues) {
paramValue.delete();
}
// 再删除当前任务
job.delete();
}
@Override
public void doCascadeJobDelete(String uids, String type) {
logger.debug("暂不实现");
}
@Override
public boolean delJob(QuartzJob quartzJob) {
// 保持事物一致性
Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
deleteQuartzQorkByJob(quartzJob);
return true;
}
});
return false;
}
}
package io.jboot.admin.jobapi.impl;
import javax.inject.Singleton;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobapi.JobLogService;
import io.jboot.admin.jobentity.JobLog;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
@Bean
@Singleton
public class JobLogServiceImpl extends JbootServiceBase<JobLog> implements JobLogService {
public Page<JobLog> findPage(JobLog log, int pageNumber, int pageSize) {
String sql = "SELECT uids, begintimes,endtimes, state, remark, nextruntime, run_ip ";
String sqlExceptSelect = " FROM job_log t ORDER BY t.begintimes DESC";
return DAO.paginate(pageNumber, pageSize, sql, sqlExceptSelect);
}
}
package io.jboot.admin.jobapi.impl;
import java.util.List;
import javax.inject.Singleton;
import io.jboot.admin.jobapi.JobParamValueService;
import io.jboot.admin.jobentity.QuartzParamValue;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
@Bean
@Singleton
public class JobParamValueServiceImpl extends JbootServiceBase<QuartzParamValue> implements JobParamValueService {
@Override
public List<QuartzParamValue> findByJobId(String jobUids) {
String sql = "select * from job_param_value where JOB_UIDS ='" + jobUids + "'";
return DAO.find(sql);
}
@Override
public List<QuartzParamValue> findByJobUids(String uids) {
String sql = "select uids, paramvalue_name, paramvalue_value from job_param_value " +
"where JOB_UIDS ='" + uids + "'";
return DAO.find(sql);
}
}
package io.jboot.admin.jobapi.impl;
import javax.inject.Singleton;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.jobapi.JobService;
import io.jboot.admin.jobentity.Job;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
@Bean
@Singleton
public class JobServiceImpl extends JbootServiceBase<Job> implements JobService {
@Override
public Page<Job> findPage(Job job, int pageNumber, int pageSize) {
Page<Job> paginate = DAO.paginate(pageNumber, pageSize, "SELECT uids, job_name AS job_name, ( SELECT name FROM job_class WHERE uids = t.JOBCLASS_UIDS" +
" ) AS jobclass_uids, t.to_quartztimes AS to_quartztimes, job_state AS job_state , CREATE_DATE AS " +
"create_date, REMARK AS remark, JOB_CONTENT as job_content "," from job t");
return paginate;
}
}
package io.jboot.admin.jobapi.impl;
import java.util.List;
import java.util.Map;
import javax.inject.Singleton;
import com.jfinal.plugin.activerecord.Page;
import io.jboot.admin.job.GetParamUtil;
import io.jboot.admin.jobapi.QuartzJobService;
import io.jboot.admin.jobentity.QuartzJob;
import io.jboot.aop.annotation.Bean;
import io.jboot.service.JbootServiceBase;
@Bean
@Singleton
public class QuartzJobServiceImpl extends JbootServiceBase<QuartzJob> implements QuartzJobService {
@Override
public Page<QuartzJob> findPage(QuartzJob job, int pageNumber, int pageSize) {
Page<QuartzJob> paginate = DAO.paginate(pageNumber, pageSize, "SELECT uids, job_name AS job_name, ( SELECT name FROM job_class WHERE uids = t.JOBCLASS_UIDS" +
" ) AS jobclass_uids, t.to_quartztimes AS to_quartztimes, job_state AS job_state , CREATE_DATE AS " +
"create_date, REMARK AS remark, JOB_CONTENT as job_content "," from job t");
return paginate;
}
@Override
public QuartzJob findQuartzJobById(String uids) {
return DAO.findFirst("SELECT uids, job_name AS job_name,job_content as job_content, ( SELECT name FROM job_class WHERE uids = " +
"t.JOBCLASS_UIDS ) AS c_name, t.to_quartztimes AS to_quartztimes,remark FROM job t where t.uids ='" + uids + "'");
}
@Override
public List<QuartzJob> findByState(String state) {
return DAO.find("select * from job where JOB_STATE ='"+ state +"'");
}
@Override
public List<QuartzJob> findByWhere(String uids) {
return DAO.find("SELECT * FROM job where jobclass_uids = '"+ uids +"'");
}
@Override
public String checkClassAllName(String classAllName) {
String ckeckClassAllName = GetParamUtil.checkClassAllName(classAllName);
return ckeckClassAllName;
}
@Override
public String checkFunctionName(String functionName, String classAllName) {
return GetParamUtil.checkFunctionName(classAllName, functionName);
}
@Override
public Map<String, String> reflectMethod(String classAllName, String functionName) {
return GetParamUtil.reflectMethod(classAllName, functionName);
}
@Override
public Map<String, String> getParamName(String classAllName, String methodsName) {
return GetParamUtil.getParamName(classAllName, methodsName);
}
}
》》》entity
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseJob;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job", primaryKey = "uids")
public class Job extends BaseJob<Job> {
}
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseJobClassParam;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job_class_param", primaryKey = "uids")
public class JobClassParam extends BaseJobClassParam<JobClassParam> {
}
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseJobLog;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job_log", primaryKey = "uids")
public class JobLog extends BaseJobLog<JobLog> {
}
/**
* Copyright 2015-2025 FLY的狐狸(email:[email protected] qq:369191470).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package io.jboot.admin.jobentity;
public class Paginator {
private int pageNo;
private int pageSize;
private int totalRecords;
public Paginator() {
this.pageNo = 1;
this.pageSize = 30;
}
public Paginator(int pageNo, int pageSize) {
this.pageNo = pageNo;
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public int getFirstResult() {
if (pageNo <= 0) {
return 0;
}
return (pageNo - 1) * pageSize;
}
public int getMaxResults() {
return pageSize;
}
}
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseQuartzJob;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job", primaryKey = "uids")
public class QuartzJob extends BaseQuartzJob<QuartzJob> {
}
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseJobClass;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job_class", primaryKey = "uids")
public class QuartzJobclass extends BaseJobClass<QuartzJobclass> {
}
package io.jboot.admin.jobentity;
import io.jboot.admin.jobentity.base.BaseJobParamValue;
import io.jboot.db.annotation.Table;
/**
* Generated by Jboot.
*/
@Table(tableName = "job_param_value", primaryKey = "uids")
public class QuartzParamValue extends BaseJobParamValue<QuartzParamValue> {
}
》》》BaseEntity
package io.jboot.admin.jobentity.base;
import io.jboot.db.model.JbootModel;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseJob<M extends BaseJob<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setJobName(java.lang.String JobName) {
set("Job_name", JobName);
}
public java.lang.String getJobName() {
return getStr("Job_name");
}
public void setJobContent(java.lang.String jobContent) {
set("Job_content", jobContent);
}
public java.lang.String getJobContent() {
return getStr("Job_content");
}
public void setJobclassUids(java.lang.String jobclassUids) {
set("jobclass_uids", jobclassUids);
}
public java.lang.String getJobclassUids() {
return getStr("jobclass_uids");
}
public void setJobState(java.lang.String jobState) {
set("job_state", jobState);
}
public java.lang.String getJobState() {
return getStr("job_state");
}
public void setJobType(java.lang.String jobType) {
set("job_type", jobType);
}
public java.lang.String getJobType() {
return getStr("job_type");
}
public void setToQuartztimes(java.lang.String toQuartztimes) {
set("to_quartztimes", toQuartztimes);
}
public java.lang.String getToQuartztimes() {
return getStr("to_quartztimes");
}
public void setRemark(java.lang.String remark) {
set("remark", remark);
}
public java.lang.String getRemark() {
return getStr("remark");
}
}
package io.jboot.admin.jobentity.base;
import io.jboot.db.model.JbootModel;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseJobClass<M extends BaseJobClass<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setName(java.lang.String name) {
set("name", name);
}
public java.lang.String getName() {
return getStr("name");
}
public void setClassAllName(java.lang.String classAllName) {
set("class_all_name", classAllName);
}
public java.lang.String getClassAllName() {
return getStr("class_all_name");
}
public void setFunctionName(java.lang.String functionName) {
set("function_name", functionName);
}
public java.lang.String getFunctionName() {
return getStr("function_name");
}
public void setRemark(java.lang.String remark) {
set("remark", remark);
}
public java.lang.String getRemark() {
return getStr("remark");
}
}
package io.jboot.admin.jobentity.base;
import io.jboot.db.model.JbootModel;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseJobClassParam<M extends BaseJobClassParam<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setClassparamName(java.lang.String classparamName) {
set("classparam_name", classparamName);
}
public java.lang.String getClassparamName() {
return getStr("classparam_name");
}
public void setClassparamState(java.lang.String classparamState) {
set("classparam_state", classparamState);
}
public java.lang.String getClassparamState() {
return getStr("classparam_state");
}
public void setReturnType(java.lang.String returnType) {
set("return_type", returnType);
}
public java.lang.String getReturnType() {
return getStr("return_type");
}
public void setClassparamType(java.lang.String classparamType) {
set("classparam_type", classparamType);
}
public java.lang.String getClassparamType() {
return getStr("classparam_type");
}
public void setParamType(java.lang.String paramType) {
set("param_type", paramType);
}
public java.lang.String getParamType() {
return getStr("param_type");
}
public void setJobclassUids(java.lang.String jobclassUids) {
set("jobclass_uids", jobclassUids);
}
public java.lang.String getJobclassUids() {
return getStr("jobclass_uids");
}
public void setParentuids(java.lang.String parentuids) {
set("parentuids", parentuids);
}
public java.lang.String getParentuids() {
return getStr("parentuids");
}
}
package io.jboot.admin.jobentity.base;
import com.jfinal.plugin.activerecord.IBean;
import io.jboot.db.model.JbootModel;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseJobLog<M extends BaseJobLog<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setBegintimes(java.lang.String begintimes) {
set("begintimes", begintimes);
}
public java.lang.String getBegintimes() {
return getStr("begintimes");
}
public void setEndtimes(java.lang.String endtimes) {
set("endtimes", endtimes);
}
public java.lang.String getEndtimes() {
return getStr("endtimes");
}
public void setContent(java.lang.String content) {
set("content", content);
}
public java.lang.String getContent() {
return getStr("content");
}
public void setType(java.lang.String type) {
set("type", type);
}
public java.lang.String getType() {
return getStr("type");
}
public void setState(java.lang.String state) {
set("state", state);
}
public java.lang.String getState() {
return getStr("state");
}
public void setJobContent(java.lang.String jobContent) {
set("job_content", jobContent);
}
public java.lang.String getJobContent() {
return getStr("job_content");
}
public void setRemark(java.lang.String remark) {
set("remark", remark);
}
public java.lang.String getRemark() {
return getStr("remark");
}
public void setJobClassandfunction(java.lang.String jobClassandfunction) {
set("job_classandfunction", jobClassandfunction);
}
public java.lang.String getJobClassandfunction() {
return getStr("job_classandfunction");
}
public void setNextruntime(java.lang.String nextruntime) {
set("nextruntime", nextruntime);
}
public java.lang.String getNextruntime() {
return getStr("nextruntime");
}
public void setJobuids(java.lang.String jobuids) {
set("jobuids", jobuids);
}
public java.lang.String getJobuids() {
return getStr("jobuids");
}
public void setRunIp(java.lang.String runIp) {
set("run_ip", runIp);
}
public java.lang.String getRunIp() {
return getStr("run_ip");
}
}
package io.jboot.admin.jobentity.base;
import io.jboot.db.model.JbootModel;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseJobParamValue<M extends BaseJobParamValue<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setParamvalueValue(java.lang.String paramvalueValue) {
set("paramvalue_value", paramvalueValue);
}
public java.lang.String getParamvalueValue() {
return getStr("paramvalue_value");
}
public void setState(java.lang.String state) {
set("state", state);
}
public java.lang.String getState() {
return getStr("state");
}
public void setParamvalueName(java.lang.String paramvalueName) {
set("paramvalue_name", paramvalueName);
}
public java.lang.String getParamvalueName() {
return getStr("paramvalue_name");
}
public void setRemark(java.lang.String remark) {
set("remark", remark);
}
public java.lang.String getRemark() {
return getStr("remark");
}
public void setParamUids(java.lang.String paramUids) {
set("param_uids", paramUids);
}
public java.lang.String getParamUids() {
return getStr("param_uids");
}
public void setJobUids(java.lang.String jobUids) {
set("job_uids", jobUids);
}
public java.lang.String getJobUids() {
return getStr("job_uids");
}
}
package io.jboot.admin.jobentity.base;
import io.jboot.db.model.JbootModel;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by Jboot, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class BaseQuartzJob<M extends BaseQuartzJob<M>> extends JbootModel<M> implements IBean {
public void setUids(java.lang.String uids) {
set("uids", uids);
}
public java.lang.String getUids() {
return getStr("uids");
}
public void setJobName(java.lang.String jobName) {
set("job_name", jobName);
}
public java.lang.String getJobName() {
return getStr("job_name");
}
public void setJobContent(java.lang.String jobContent) {
set("job_content", jobContent);
}
public java.lang.String getJobContent() {
return getStr("job_content");
}
public void setJobclassUids(java.lang.String jobclassUids) {
set("jobclass_uids", jobclassUids);
}
public java.lang.String getJobclassUids() {
return getStr("jobclass_uids");
}
public void setJobState(java.lang.String jobState) {
set("job_state", jobState);
}
public java.lang.String getJobState() {
return getStr("job_state");
}
public void setRemark(java.lang.String remark) {
set("remark", remark);
}
public java.lang.String getRemark() {
return getStr("remark");
}
public void setJobType(java.lang.String jobType) {
set("job_type", jobType);
}
public java.lang.String getJobType() {
return getStr("job_type");
}
public void setCreateDate(java.util.Date createDate) {
set("create_date", createDate);
}
public java.util.Date getCreateDate() {
return get("create_date");
}
public void setToQuartztimes(java.lang.String toQuartztimes) {
set("to_quartztimes", toQuartztimes);
}
public java.lang.String getToQuartztimes() {
return getStr("to_quartztimes");
}
}
需要引入的jar
<dependency>
<groupId>org.opensymphony.quartz</groupId>
<artifactId>quartz-all</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
》》》sql
job.sql
CREATE TABLE `job` (
`uids` varchar(64) NOT NULL COMMENT '主键',
`job_name` varchar(450) DEFAULT NULL,
`job_content` varchar(450) DEFAULT NULL,
`jobclass_uids` varchar(100) DEFAULT NULL COMMENT 'job_class 表主键',
`job_state` varchar(1) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
`job_type` varchar(10) DEFAULT NULL,
`create_date` timestamp NULL DEFAULT NULL,
`to_quartztimes` varchar(255) NOT NULL COMMENT '时间规则表达式',
PRIMARY KEY (`uids`) USING BTREE,
KEY `FK_JOB_CLASS_UIDS` (`jobclass_uids`) USING BTREE,
CONSTRAINT `job_ibfk_1` FOREIGN KEY (`jobclass_uids`) REFERENCES `job_class` (`uids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='调度任务表';
job_class.sql
CREATE TABLE `job_class` (
`uids` varchar(64) NOT NULL COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`class_all_name` varchar(255) DEFAULT NULL COMMENT 'java类全名称',
`function_name` varchar(100) DEFAULT NULL COMMENT '方法名称',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`uids`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='任务job执行class';
job_class_param
CREATE TABLE `job_class_param` (
`uids` varchar(64) NOT NULL,
`classparam_name` varchar(50) DEFAULT NULL,
`classparam_state` varchar(1) DEFAULT NULL,
`return_type` varchar(30) DEFAULT NULL,
`classparam_type` varchar(1) DEFAULT NULL,
`param_type` varchar(30) DEFAULT NULL,
`jobclass_uids` varchar(64) DEFAULT NULL COMMENT 'job_class 表主键',
`parentuids` varchar(32) DEFAULT NULL,
PRIMARY KEY (`uids`) USING BTREE,
KEY `UIDS` (`uids`) USING BTREE,
KEY `FK_JOBCLASS_UIDS` (`parentuids`) USING BTREE,
CONSTRAINT `job_class_param_ibfk_1` FOREIGN KEY (`parentuids`) REFERENCES `job_class` (`uids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='job执行关联的class的方法和参数';
job_log.sql
CREATE TABLE `job_log` (
`uids` varchar(64) NOT NULL,
`begintimes` varchar(40) DEFAULT NULL,
`endtimes` varchar(40) DEFAULT NULL,
`content` varchar(200) DEFAULT NULL,
`type` varchar(1) DEFAULT NULL,
`state` varchar(1) DEFAULT NULL,
`job_content` varchar(200) DEFAULT NULL,
`remark` varchar(3000) DEFAULT NULL,
`job_classandfunction` varchar(1000) DEFAULT NULL,
`nextruntime` varchar(40) DEFAULT NULL,
`jobuids` varchar(64) DEFAULT NULL,
`run_ip` varchar(32) DEFAULT NULL,
PRIMARY KEY (`uids`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='job任务执行日志';
job_param_value.sql
CREATE TABLE `job_param_value` (
`uids` varchar(64) NOT NULL,
`paramvalue_value` varchar(500) DEFAULT NULL,
`state` varchar(1) DEFAULT NULL,
`paramvalue_name` varchar(50) DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
`param_uids` varchar(64) DEFAULT NULL COMMENT 'job_class_param 主键',
`job_uids` varchar(64) DEFAULT NULL COMMENT 'job 表主键',
PRIMARY KEY (`uids`) USING BTREE,
KEY `fk_jobuids` (`job_uids`) USING BTREE,
KEY `fk_param_uids` (`param_uids`) USING BTREE,
CONSTRAINT `job_param_value_ibfk_1` FOREIGN KEY (`job_uids`) REFERENCES `job` (`uids`),
CONSTRAINT `job_param_value_ibfk_2` FOREIGN KEY (`param_uids`) REFERENCES `job_class_param` (`uids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='任务关联的执行类对应的参数值表';
html
jobclass
index.html
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['table', 'layer'], function () {
var table = layui.table
, layer = layui.layer
, $ = layui.jquery
, form = layui.form;
// 表格渲染
var tableIns = table.render({
elem: '#dateTable' //指定原始表格元素选择器(推荐id选择器)
, id: 'dateTable'
, even: true //开启隔行背景
//, size: 'sm' //小尺寸的表格
, height: 'full-150' //容器高度
, cols: [[
{field: 'name', title: '名称', width: 300 , align: 'left'}
, {field: 'classAllName', title: '类名(含包名)', width: 350 , align: 'left'}
, {field: 'functionName', title: '方法名', width: 260 , align: 'center'}
, {field: 'remark', title: '备注', align: 'left'}
, {fixed: 'right', title: '操作', width: 260, align: 'center', toolbar: '#barOption'}
]]
, url: '#(ctxPath)/quartz/jobclass/tableData'
, method: 'get'
, request: {
pageName: 'pageNumber' //页码的参数名称,默认:page
,limitName: 'pageSize' //每页数据量的参数名,默认:limit
}
, page: true
, limits: [30, 60, 90, 150, 300]
, limit: 30 //默认采用30
, loading: true
, done: function (res, curr, count) {
}
});
table.on('tool(dateTable)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除?', function(index){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobclass/del',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
},
unSuccess: function (data) {
layer.msg(data.data);
}
})
});
} else if(obj.event === 'edit'){
pop_show('编辑活动','#(ctxPath)/wmall/admin/commodityDiscount/update?id='+data.id,'800','610', function(){
reloadTableQuery();
});
}else if(obj.event === 'runJobsOnce'){
layer.confirm('执行一次任务?', function(index){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/runJobsOnce',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
},
unSuccess: function (data) {
layer.msg(data.data);
}
});
});
}else if(obj.event === 'normalActive'){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/addJob',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
}
});
}
});
$("#add").click(function(){
pop_show('新增','#(ctxPath)/quartz/jobclass/add','800','550', function(){
reloadTableQuery();
});
});
reloadTableQuery = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/jobclass/tableData'
,where: {} //设定异步数据接口的额外参数
});
}
reloadTable = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/jobclass/tableData'
,where: {} //设定异步数据接口的额外参数
,page:{curr:1}
});
}
form.on('submit(search)', function(data){
reloadTable();
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="layui-fluid">
<form id="searchForm" class="layui-form x-center" action="" >
<div class="layui-form-pane">
<!-- <div class="layui-form-item">
<label class="layui-form-label">活动名称</label>
<div class="layui-input-inline">
<input type="text" id="name" name="name" placeholder="活动名称" class="layui-input"/>
</div>
<div class="layui-input-inline" style="width : 80px">
<button class="layui-btn" lay-submit="" lay-filter="search"><i class="layui-icon"></i></button>
</div>
</div> -->
</div>
</form>
<hr>
<div class="layui-row">
<div class="layui-btn-group">
#shiroHasPermission('/quartz/jobclass/addJob')
<button id="add" class="layui-btn layui-btn-small">新增</button>
#end
</div>
<table id="dateTable" lay-filter="dateTable"></table>
</div>
</div>
<script type="text/html" id="barOption">
#shiroHasPermission('/quartz/jobclass/del')
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
#end
</script>
#end
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
// 操作对象
var form = layui.form
, layer = layui.layer
, $ = layui.jquery;
form.on('submit(sub)', function(data){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobclass/save',
data: $('#addForm').serialize(),
loadFlag: true,
success : function(data){
pop_close();
}
});
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="x-body">
<form id="addForm" class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>任务名称</label>
<div class="layui-input-block">
<input type="text" name="quartzClassJob.name" placeholder="任务名称" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>执行类</label>
<div class="layui-input-block">
<input type="text" name="quartzClassJob.classAllName" placeholder="执行类" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>执行方法</label>
<div class="layui-input-block">
<input type="text" name="quartzClassJob.functionName" placeholder="执行方法" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>备注</label>
<div class="layui-input-block">
<input type="text" name="quartzClassJob.remark" placeholder="备注" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<button class="layui-btn" lay-filter="sub" lay-submit>
保存
</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
#end
jobs
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['table', 'layer'], function () {
var table = layui.table
, layer = layui.layer
, $ = layui.jquery
, form = layui.form;
// 表格渲染
var tableIns = table.render({
elem: '#dateTable' //指定原始表格元素选择器(推荐id选择器)
, id: 'dateTable'
, even: true //开启隔行背景
//, size: 'sm' //小尺寸的表格
, height: 'full-150' //容器高度
, cols: [[
/* {field: 'uids', title: 'id', width: 200, align: 'center' }
, */ {field: 'jobName', title: '任务名', width: 230 , align: 'center'}
, {field: 'jobContent', title: '任务内容(描述)', width: 230 , align: 'center'}
, {field: 'jobclassUids', title: '执行类', width: 230 , align: 'center'}
, {field: 'jobState', title: '任务状态', width: 230 , align: 'center',toolbar: '#barOptionState'}
, {field: 'remark', title: '备注', width: 230 , align: 'center'}
, {field: 'toQuartztimes', title: '定时运行时间(Quartz表达式)', width: 260 , align: 'center'}
, {fixed: 'right', title: '操作', width: 250, align: 'center', toolbar: '#barOption'} //杩欓噷鐨則oolbar鍊兼槸妯℃澘鍏冪礌鐨勯�夋嫨鍣�
]]
, url: '#(ctxPath)/quartz/jobs/tableData'
, method: 'get'
, request: {
pageName: 'pageNumber' //页码的参数名称,默认:page
,limitName: 'pageSize' //每页数据量的参数名,默认:limit
}
, page: true
, limits: [30, 60, 90, 150, 300]
, limit: 30 //默认采用30
, loading: true
, done: function (res, curr, count) {
}
});
table.on('tool(dateTable)', function(obj){
var data = obj.data;
if(obj.event === 'stop'){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/stopJobs',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
},
unSuccess: function (data) {
layer.msg(data.data);
}
})
} else if(obj.event === 'edit'){
pop_show('编辑','#(ctxPath)/quartz/jobs/edit?id='+data.uids,'800','610', function(){
reloadTableQuery();
});
}else if(obj.event === 'runJobsOnce'){
layer.confirm('执行一次任务?', function(index){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/runJobsOnce',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
},
unSuccess: function (data) {
layer.msg(data.data);
}
});
});
}else if(obj.event === 'normalActive'){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/addJob',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
}
});
} else if(obj.event === 'del'){
layer.confirm('确定删除吗?', function(index){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/deleteJob',
data: {id : data.uids},
loadFlag: true,
success : function(data){
layer.msg(data.data);
reloadTableQuery();
}
});
});
}
});
$("#add").click(function(){
pop_show('添加活动','#(ctxPath)/quartz/jobs/add','800','550', function(){
reloadTableQuery();
});
});
reloadTableQuery = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/jobs/tableData'
,where: {} //设定异步数据接口的额外参数
});
}
reloadTable = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/jobs/tableData'
,where: {} //设定异步数据接口的额外参数
,page:{curr:1}
});
}
form.on('submit(search)', function(data){
reloadTable();
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="layui-fluid">
<form id="searchForm" class="layui-form x-center" action="" >
<div class="layui-form-pane">
<!-- <div class="layui-form-item">
<label class="layui-form-label">活动名称</label>
<div class="layui-input-inline">
<input type="text" id="name" name="name" placeholder="活动名称" class="layui-input"/>
</div>
<div class="layui-input-inline" style="width : 80px">
<button class="layui-btn" lay-submit="" lay-filter="search"><i class="layui-icon"></i></button>
</div>
</div> -->
</div>
</form>
<hr>
<div class="layui-row">
<div class="layui-btn-group">
#shiroHasPermission('/quartz/jobs/addJob')
<button id="add" class="layui-btn layui-btn-small">新增任务</button>
#end
</div>
<table id="dateTable" lay-filter="dateTable"></table>
</div>
</div>
<script type="text/html" id="barOption">
#[[
{{# if(d.jobState == '1' || d.jobState == null){ }}
]]#
#shiroHasPermission('/quartz/jobs/addJob')
<a class="layui-btn layui-btn-normal layui-btn-xs layui-bg-green" lay-event="normalActive">启用</a>
#end
#[[
{{# } }}
]]#
#[[
{{# if(d.jobState == '1' || d.jobState == null){ }}
]]#
#shiroHasPermission('/quartz/jobs/addJob')
<a class="layui-btn layui-btn-normal layui-btn-xs layui-bg-orange" lay-event="edit">修改</a>
#end
#[[
{{# } }}
]]#
#[[
{{# if(d.jobState == '0'){ }}
]]#
#shiroHasPermission('/quartz/jobs/addJob')
<a class="layui-btn layui-btn-danger layui-btn-xs layui-bg-cyan" lay-event="stop">停用</a>
#end
#[[
{{# } }}
]]#
#shiroHasPermission('/quartz/jobs/addJob')
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="runJobsOnce">执行一次</a>
#end
#shiroHasPermission('/quartz/jobs/deleteJob')
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
#end
</script>
<script type="text/html" id="barOptionState">
#[[
{{# if(d.jobState == '1' || d.jobState == null){ }}
]]#
<p>停用</p>
#[[
{{# } }}
]]#
#[[
{{# if(d.jobState == '0'){ }}
]]#
<p>启用</p>
#[[
{{# } }}
]]#
</script>
#end
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
// 操作对象
var form = layui.form
, layer = layui.layer
, $ = layui.jquery;
form.on('submit(sub)', function(data){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/save',
data: $('#addForm').serialize(),
loadFlag: true,
success : function(data){
pop_close();
}
});
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="x-body">
<form id="addForm" class="layui-form" action="">
<input type="hidden" name="quartzJob.uids" value="#(quartzJob.uids)">
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>任务名称</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.jobName" value="#(quartzJob.jobName)" disabled="disabled" placeholder="任务名称" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>任务描述</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.jobContent" value="#(quartzJob.jobContent)" placeholder="任务描述" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>Quartz表达式</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.toQuartztimes" value="#(quartzJob.toQuartztimes)" placeholder="Quartz表达式" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>备注</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.remark" value="#(quartzJob.remark)" placeholder="备注" class="layui-input" autocomplete="off"/>
</div>
</div>
<table cellspacing="0" cellpadding="0" border="0" class="layui-table">
<thead>
<tr>
<th>参数名称</th>
<th>参数值</th>
</tr>
</thead>
<tbody>
#for(item:values)
<tr>
<input type="hidden" name="paramValue.uids" value="#(item.uids)"/>
<td>#(item.paramvalue_name)</td>
<td><input type="text" name="paramValue.paramvalue_value" valid="vtext" validname="参数值" class="layui-input"
value="#(item.paramvalue_value)"/>
</td>
</tr>
#end
</tbody>
</table>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<button class="layui-btn" lay-filter="sub" lay-submit>
保存
</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
#end
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
// 操作对象
var form = layui.form
, layer = layui.layer
, $ = layui.jquery;
form.on('submit(sub)', function(data){
util.sendAjax ({
type: 'POST',
url: '#(ctxPath)/quartz/jobs/save',
data: $('#addForm').serialize(),
loadFlag: true,
success : function(data){
pop_close();
}
});
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="x-body">
<form id="addForm" class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>任务名称</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.jobName" placeholder="任务名称" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>任务描述</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.jobContent" placeholder="任务描述" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>执行类</label>
<div class="layui-input-block">
<select name="quartzJob.jobclassUids">
#for(jobclass : jobclassLsit)
<option value="#(jobclass.uids)">#(jobclass.name)</option>
#end
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>Quartz表达式</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.toQuartztimes" placeholder="Quartz表达式" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>备注</label>
<div class="layui-input-block">
<input type="text" name="quartzJob.remark" placeholder="备注" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<button class="layui-btn" lay-filter="sub" lay-submit>
保存
</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
#end
log
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['table', 'layer'], function () {
var table = layui.table
, layer = layui.layer
, $ = layui.jquery
, form = layui.form;
// 表格渲染
var tableIns = table.render({
elem: '#dateTable' //指定原始表格元素选择器(推荐id选择器)
, id: 'dateTable'
, even: true //开启隔行背景
//, size: 'sm' //小尺寸的表格
, height: 'full-150' //容器高度
, cols: [[
{field: 'begintimes', title: '执行开始时间', width: 210, align: 'center' }
, {field: 'endtimes', title: '执行结束时间', width: 210 , align: 'center'}
, {field: 'state', title: '状态', width: 100 , align: 'center', toolbar: '#barOptionState'}
, {field: 'nextruntime', title: '下次执行时间', width: 200 , align: 'center'}
, {field: 'runIp', title: 'ip', width: 140 , align: 'center'}
, {field: 'remark', title: '备注',width: 663 , align: 'left'}
, {fixed: 'right', title: '操作', width: 120, align: 'center', toolbar: '#barOption'}
]]
, url: '#(ctxPath)/quartz/log/tableData'
, method: 'get'
, request: {
pageName: 'pageNumber' //页码的参数名称,默认:page
,limitName: 'pageSize' //每页数据量的参数名,默认:limit
}
, page: true
, limits: [30, 60, 90, 150, 300]
, limit: 30 //默认采用30
, loading: true
, done: function (res, curr, count) {
}
});
table.on('tool(dateTable)', function(obj){
var data = obj.data;
if(obj.event === 'details'){
pop_show('详情','#(ctxPath)/quartz/log/view?id='+data.uids,'500','550', function(){
});
}
});
reloadTableQuery = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/log/tableData'
,where: {} //设定异步数据接口的额外参数
});
}
reloadTable = function () {
table.reload('dateTable', {
url: '#(ctxPath)/quartz/log/tableData'
,where: {} //设定异步数据接口的额外参数
,page:{curr:1}
});
}
form.on('submit(search)', function(data){
reloadTable();
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
});
</script>
#end
#define content()
<div class="layui-fluid">
<form id="searchForm" class="layui-form x-center" action="" >
<div class="layui-form-pane">
</div>
</form>
<hr>
<div class="layui-row">
<table id="dateTable" lay-filter="dateTable"></table>
</div>
</div>
<script type="text/html" id="barOption">
#shiroHasPermission('/quartz/jobclass/view')
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="details">详情</a>
#end
</script>
<script type="text/html" id="barOptionState">
#[[
{{# if(d.state == '1'){ }}
]]#
<p>成功</p>
#[[
{{# } }}
]]#
#[[
{{# if(d.state == '0'){ }}
]]#
<p>失败</p>
#[[
{{# } }}
]]#
</script>
#end
#include("/template/common/layout/_page_layout.html")
#@layout()
#define css()
<style>
.layui-form-label{
width: 100px;
}
.layui-input-block{
margin-left: 130px;
}
</style>
#end
#define js()
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
// 操作对象
var form = layui.form
, layer = layui.layer
, $ = layui.jquery;
});
$('.layui-btn').click(function () {
close_self();
layer.close(layer.index);
});
</script>
#end
#define content()
<div class="x-body">
<form id="addForm" class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label" style=""><em class="require-mark">*</em>执行开始时间</label>
<div class="layui-input-block" style="">
<input type="text" disabled="disabled" name="jobLog.begintimes" value="#(jobLog.begintimes)" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>执行结束时间</label>
<div class="layui-input-block">
<input type="text" disabled="disabled" name="jobLog.endtimes" value="#(jobLog.endtimes)" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>状态</label>
<div class="layui-input-block">
<input type="text" disabled="disabled" name="jobLog.state" #if(jobLog.state == '1') value="成功" #end #if(jobLog.state == '0') value="失败" #end class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>下次执行时间</label>
<div class="layui-input-block">
<input type="text" disabled="disabled" name="jobLog.nextruntime" value="#(jobLog.nextruntime)" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>ip</label>
<div class="layui-input-block">
<input type="text" disabled="disabled" name="jobLog.runIp" value="#(jobLog.runIp)" class="layui-input" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><em class="require-mark">*</em>备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" disabled="disabled" class="layui-textarea" style="height:160px;" name="comment.businessReply">#(jobLog.remark)</textarea>
</div>
</div>
</form>
</div>
#end
备注:数据库建好后生成对应的 service层 实体类 和实现类,因为后端用的是jboot框架(Jfinal也适用),所以其他框架的可以根据自己使用的框架进行修改 service层 实体类 和实现类。前端用的是Layui框架,前面页面如果用Layui的话是稍微改下就可以直接用的。