状况说明
springboot项目集成了 quarzt
本地测试一直没问题,发布上线后,一直启动不起来报错如下
2020-10-27 12:52:51 [main] ERROR o.s.b.SpringApplication:826 Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scheduleJobController': Unsatisfied dependency expressed through field 'scheduleJobService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scheduleJobService': Invocation of init method failed; nested exception is java.lang.RuntimeException: 创建定时任务失败
Caused by: java.lang.RuntimeException: 创建定时任务失败
at com.mtons.liflag.web.job.utils.ScheduleUtils.createScheduleJob(ScheduleUtils.java:66)
at com.mtons.liflag.web.job.service.impl.ScheduleJobServiceImpl.init(ScheduleJobServiceImpl.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
... 61 common frames omitted
Caused by: org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.TASK_1', because one already exists with this identification.
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1113)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$2.executeVoid(JobStoreSupport.java:1067)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3780)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3778)
at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:245)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJobAndTrigger(JobStoreSupport.java:1063)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:855)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
at com.mtons.liflag.web.job.utils.ScheduleUtils.createScheduleJob(ScheduleUtils.java:59)
... 69 common frames omitted
解决过程
百度一番说是spring加载了两次会遇到这个问题,然后我检查了一番新写的代码并没有引起重复加载的问题
实在信不过,我把代码回滚到修改之前,还是报错
基本确认不是代码问题
猜测是在更新代码的时候,没有正常停服务,导致表中产生了脏数据
解决方案
删除数据 qrtz_job_details 中的数据
正常而言,qrtz_triggers表中对qrtz_job_details有外键引用,所以直接是删除不掉的,而qrtz_cron_triggers表中又有对qrtz_triggers的外键引用.所以,要按照:以下顺序删除数据
qrtz_cron_triggers> qrtz_triggers> qrtz_job_details
执行三条sql后,项目正常启动
DELETE from qrtz_cron_triggers;
DELETE from qrtz_triggers;
DELETE from qrtz_job_details;