如何解决Quartz Scheduler任务突然未运行
任务已经开始,但神经执行了,有人知道那里出什么问题了吗? 现在的问题是,每次我运行代码时,它只会给我输出
这是最后的日志
2020-11-02 17:03:30.852 DEBUG 9264 --- [nio-8089-exec-7] c.z.t.c.quartz.QuartzScheduleManager : addNewCronJob() called with: jobInfo = [JobInfo(className=class com.zx.tzgl.cronJob.YearPlanJob,identifier=25ddaab4-3e3b-45e9-84a3-77ff7ca4c049,groupName=zx,cornExpr=00 18 17 02 11 ? 2020,params={PLAY_YEAR_SWITCH_PARAMS={"planType":"1","isOpen":"1","enable":"1","annual":"2020至2025","closeTime":1604307810844,"id":"1"}})]
2020-11-02 17:03:30.852 INFO 9264 --- [nio-8089-exec-7] org.quartz.core.QuartzScheduler : Scheduler SchedulerFactory_$_NON_CLUSTERED started.
这是我使用的石英版
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
这是crystal.properties文件的内容
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 100
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 5000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myQuartzDB
org.quartz.dataSource.myQuartzDB.driver:oracle.jdbc.OracleDriver
#org.quartz.dataSource.myQuartzDB.URL:jdbc:oracle:thin:@//xx.xx.xx.xx:xxxx/cdb1
#org.quartz.dataSource.myQuartzDB.user:xxxx
#org.quartz.dataSource.myQuartzDB.password:xxxx
org.quartz.dataSource.myQuartzDB.URL:jdbc:oracle:thin:@//xx.xx.x.xx:xxxx/szorcl
org.quartz.dataSource.myQuartzDB.user:xxxx
org.quartz.dataSource.myQuartzDB.password:xxxx
org.quartz.dataSource.myQuartzDB.maxConnections:10
org.quartz.jobStore.isClustered=false
这里的配置
@Configuration
public class QuartzConfig {
@Resource
private MyJobFactory myJobFactory;
@Bean(name = "SchedulerFactory")
public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setQuartzProperties(quartzProperties());
factory.setJobFactory(myJobFactory);
return factory;
}
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("config/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
@Bean
public QuartzInitializerListener executorListener() {
return new QuartzInitializerListener();
}
@Bean(name = "quartzScheduler")
public Scheduler scheduler() throws IOException {
return schedulerFactoryBean().getScheduler();
}
}
@Component
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
这是施杜勒经理
@Component
@Slf4j
public class QuartzScheduleManager implements QuartzScheduleI {
@Resource(name = "quartzScheduler")
private Scheduler scheduler;
@Override @SneakyThrows
public void checkAndAddCornJob(JobInfo jobInfo) {
if (isExistJob(jobInfo)) {
resumeJob(jobInfo);
} else {
addNewCronJob(jobInfo);
}
}
@Override @SneakyThrows
public boolean isExistJob(JobInfo jobInfo) {
return scheduler.checkExists(new JobKey(jobInfo.getIdentifier(),jobInfo.getGroupName()));
}
@Override @SneakyThrows
public boolean isExistJob2(JobInfo jobInfo) {
boolean isExist = false;
JobKey jobKey1 = new JobKey(jobInfo.getIdentifier(),jobInfo.getGroupName());
List<? extends Trigger> triggers1 = scheduler.getTriggersOfJob(jobKey1);
if (triggers1.size() > 0) {
for (Trigger tg : triggers1) {
if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {
isExist = true;
}
}
}
return isExist;
}
private void addNewCronJob(JobInfo jobInfo) throws Exception {
scheduler.start();
//build job info
JobDetail jobDetail = JobBuilder.newJob(jobInfo.getClassName()).
withIdentity(jobInfo.getIdentifier(),jobInfo.getGroupName())
.build();
//add params to job
if (ObjectUtil.isNotNull(jobInfo.getParams()) && !jobInfo.getParams().isEmpty()) {
jobInfo.getParams().forEach((key,value) -> jobDetail.getJobDataMap().put(key,value));
}
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getCornExpr());
CronTrigger trigger = TriggerBuilder.newTrigger().
withIdentity(jobInfo.getIdentifier(),jobInfo.getGroupName())
.forJob(jobDetail)
.withSchedule(scheduleBuilder)
.build();
try {
scheduler.scheduleJob(jobDetail,trigger);
} catch (SchedulerException e) {
throw new CustomException(ResultCode.PARAM_ERROR.getCode(),e.getMessage());
}
}
这里是工作倾听者
public class YearPlanJob implements Job {
@Override public void execute(JobExecutionContext jobExecutionContext) {
JobDetail jobDetail = jobExecutionContext.getJobDetail();
JobDataMap jobDataMap;
if (!jobDetail.getJobDataMap().isEmpty()) {
jobDataMap = jobDetail.getJobDataMap();
} else {
jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
}
}
}
这是我的测试代码
public String testQuartzTask() {
Date date = DateUtil.parse("2020-11-02 17:18:00","yyyy-MM-dd HH:mm:ss");
PlanapplyYear planapplyYear = new PlanapplyYear();
planapplyYear.setCloseTime(new Date());
String jsonParams = JSONUtil.toJsonStr(planapplyYear);
JobInfo jobInfo = new JobInfo();
jobInfo.setClassName(YearPlanJob.class);
jobInfo.setIdentifier(UUID.randomUUID().toString());
jobInfo.setGroupName("zx");
jobInfo.setCornExpr(CronDateUtils.getCron(date));
jobInfo.setParams(ImmutableMap.of(PLAN_YEAR_SWITCH,jsonParams));
mQuartzScheduleManager.checkAndAddCornJob(jobInfo);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。