org.quartz.SchedulerException: Based on configured schedule, the given trigger 'xxx'will never fire.

quartz调度时报错:

[2020-03-22 10:35:52.615] [main] ERROR c.c.fangcun.edge.facade.quartz.utils.QuartzManage - 创建定时任务失败
org.quartz.SchedulerException: Based on configured schedule, the given trigger 'DEFAULT.TASK_74759cd741b64567ab59742e5eb4664c' will never fire.
        at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:882)
        at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
        at cn.cloudwalk.fangcun.edge.facade.quartz.utils.QuartzManage.addJob(QuartzManage.java:57)
        at cn.cloudwalk.fangcun.edge.facade.quartz.config.JobRunner.run(JobRunner.java:67)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:723)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:713)
        at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:304)
        at cn.cloudwalk.fangcun.edge.FangcunEdgeApplication.main(FangcunEdgeApplication.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.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)
        at java.lang.Thread.run(Thread.java:748)
[2020-03-22 10:35:52.634] [main] ERROR c.c.fangcun.edge.facade.quartz.config.JobRunner - job info: {"beanName":"fusionQuartzTask","createTime":1584789186009,"createUserId":"admin","cronExpression":"30 13 19 21 3 ? 2020","delFlag":"N","deviceId":"51cdef13fae97cc917f0294c0ee71f9e","id":"74759cd741b64567ab59742e5eb4664c","jobName":"fusionQuartzTask","lastUpdateTime":1584789186009,"lastUpdateUserId":"admin","methodName":"algorithmSuperposition","params":"{\"corpId\":\"cloudwalktest\",\"decodingType\":0,\"deviceId\":\"51cdef13fae97cc917f0294c0ee71f9e\",\"fusionDetail\":\"{\\\"AIParameters\\\":[{\\\"AiFusionParameters\\\":[{\\\"color\\\":2,\\\"type\\\":1},{\\\"color\\\":2,\\\"pos\\\":2,\\\"size\\\":14,\\\"type\\\":2}],\\\"AIType\\\":1,\\\"AIID\\\":1}]}\",\"jobId\":\"74759cd741b64567ab59742e5eb4664c\",\"orgId\":\"102086139904524288\",\"runCron\":\"30 13 19 21 3 ? 2020\",\"runTimes\":17280000000,\"taskId\":\"3\",\"taskName\":\"测试视频融合-1\",\"taskType\":\"fusion\"}","runStatus":1,"taskId":"3"}.
[2020-03-22 10:35:52.634] [main] ERROR c.c.fangcun.edge.facade.quartz.config.JobRunner - add job catch exception, cause:
cn.cloudwalk.fangcun.edge.common.exception.BusinessException: 创建定时任务失败
        at cn.cloudwalk.fangcun.edge.facade.quartz.utils.QuartzManage.addJob(QuartzManage.java:65)
        at cn.cloudwalk.fangcun.edge.facade.quartz.config.JobRunner.run(JobRunner.java:67)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:723)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:713)
        at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:304)
        at cn.cloudwalk.fangcun.edge.FangcunEdgeApplication.main(FangcunEdgeApplication.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.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)
        at java.lang.Thread.run(Thread.java:748)

错误原因:

Based on configured schedule, the given trigger 'DEFAULT.xxx' will never fire.

被quartz调度的某个任务通过cron表达式配置了不合法或过去的时间;该job永远不会被执行到

解决方案:

重新设置合法的触发时间

在Spring框架中使用Quartz调度器时,如果出现“`Scheduler Context initialization failed`”或“`BeanCreationException`”,通常表明在调度器的初始化过程中发生了配置错误或资源不可用的问题。此外,“触发器永远不会触发”的现象可能与调度器未正确启动、任务未正确绑定触发器或线程池配置不当有关。 以下是对这些问题的分析和解决方案: ### 1. 检查 Quartz Bean 配置 确保 `JobDetail` 和 `Trigger` 正确地定义并绑定到调度器中。例如,若使用 XML 配置,需确认如下内容: - `JobDetailFactoryBean` 是否正确指定了 `jobClass`。 - `CronTriggerFactoryBean` 或 `SimpleTriggerFactoryBean` 是否设置了正确的调度时间表达式。 - 调度器是否通过 `SchedulerFactoryBean` 正确加载了所有作业和触发器。 示例 Java 配置代码如下: ```java @Bean public JobDetail jobDetail() { return JobBuilder.newJob(JobCreateOne2.class).withIdentity("jobCreateOne2").storeDurably().build(); } @Bean public Trigger trigger(JobDetail jobDetail) { return TriggerBuilder.newTrigger() .forJob(jobDetail) .withIdentity("triggerOne2") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()) .build(); } ``` ### 2. 确保调度器正常启动 检查 `SchedulerFactoryBean` 的配置是否启用自动启动,并且调度器未被手动关闭: ```java @Bean public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setJobFactory(new SpringBeanJobFactory(applicationContext.getAutowireCapableBeanFactory())); factory.setAutoStartup(true); return factory; } ``` 若调度器未自动启动,将导致触发器无法执行[^1]。 ### 3. 处理 BeanCreationException `BeanCreationException` 通常由依赖注入失败引起。检查以下方面: - `Job` 类是否标注为 `@Component` 或 `@Service`,以便 Spring 可以管理其实例。 - 是否正确使用 `SpringBeanJobFactory` 来支持依赖注入。 - 日志中是否有更详细的异常堆栈信息,定位具体出错的类或方法。 ### 4. 线程池配置问题 Quartz 默认使用的线程池大小可能不足以处理多个任务。可以在 `application.properties` 或 XML 中调整线程池大小: ```properties org.quartz.threadPool.threadCount=5 ``` 若线程池太小,可能导致任务排队甚至无法执行。 ### 5. 检查 Cron 表达式或调度时间设置 若使用的是 `CronTrigger`,请确保表达式格式正确。例如,每 10 秒执行一次应为: ``` "0/10 * * * * ?" ``` 若表达式有误,可能导致触发器从未被触发。 ### 6. 日志排查 查看日志文件中是否包含类似以下信息: ``` ERROR org.springframework.scheduling.quartz.SchedulerFactoryBean - Initializing Quartz Scheduler failed ``` 这通常表示调度器初始化失败的具体原因,如数据库连接失败、锁机制异常等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值