Job定时任务

 项目运行可视化修改定时参数,立即执行任务。
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

扫描二维码关注公众号,回复: 4862679 查看本文章
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">&#xe615;</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">&#xe615;</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的话是稍微改下就可以直接用的。

猜你喜欢

转载自blog.csdn.net/weixin_41690497/article/details/85259931