package cn.stylefeng.guns.modular.zsx.bs.job.quartz;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.guns.modular.zsx.bs.job.constant.QuartzEnum;
import cn.stylefeng.guns.modular.zsx.bs.job.entity.SysJob;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.lang.reflect.Method;
/**
* @author fulin
* @since 2023/6/14 15:10
*
* 1. 此类作为所有任务的执行入口,其他要执行的具体逻辑应该注入spring,然后通过此 通过反射调用到具体任务执行类
* 2. sysJob包含着要执行的具体逻辑类的信息,以及方法,参数等信息,此案例维护在数据库中
* 3. 通过更改数据库数据,动态变更quartz中的任务
* 4. 目前仅仅做了无参构造器的方法执行,后续补充
*
*/
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 获取任务执行参数
SysJob sysJob = (SysJob) context.getJobDetail().getJobDataMap().get(QuartzEnum.jobKey);
// invokeTarget 应该符合 类.方法名 例如 task.sout()
String invokeTarget = sysJob.getInvokeTarget();
String beanName = invokeTarget.split("\\.")[0];
String temp = invokeTarget.split("\\.")[1];
String methodName = temp.substring(0, temp.indexOf("("));
Object bean = SpringUtil.getBean(beanName);
Method method = null;
try {
method = bean.getClass().getMethod(methodName);
method.invoke(bean);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}