如何解决SpringBoot定时任务报错Unexpected error occurred in scheduled task问题

 更新时间:2024年08月02日 09:04:22   作者:栖迟于一丘  
这篇文章主要介绍了如何解决SpringBoot定时任务报错Unexpected error occurred in scheduled task问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

spring boot项目在线上一直正常运行没有错误,然后今天发生了报错,如图

这是一个定时器错误,发生这个报错

主要有两个原因

  • 定时器编写的有错误
  • @Scheduled注解方式级别高于资源注入级别,导致了资源注入失败

以下是我的代码

@RestController
@Slf4j
@SuppressWarnings({"all"})
@CrossOrigin
@RequestMapping("/journal")
@Component
public class JournalController {

	@Autowired
    Journal_timeMapper journal_timeMapper;
    
       /**
     * 每周日将签到时间数据清空
     */
    @Scheduled(cron = "0 0 0 * * SUN")
    public void journaltimeout() {
        List<Journal_time> journal_times = journal_timeMapper.selectList(null);
        for (Journal_time journal_time : journal_times) {
            journal_time.setDay_time("0小时0分钟");
            journal_time.setWeek_time("0小时0分钟");
            journal_time.setAll_time("0小时0分钟");
            journal_time.setWeek_time_desc("第0名");
            journal_timeMapper.updateById(journal_time);
        }
    }


    /**
     * 每天晚上将一天签到数据清空
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void daytimeout() {
        List<Journal_time> journal_times = journal_timeMapper.selectList(null);
        for (Journal_time journal_time : journal_times) {
            journal_time.setDay_time("0小时0分钟");
            journal_timeMapper.updateById(journal_time);
        }
    }
}

有一个特别奇怪的点,就是我的daytimeout方法一直在生效,但是journaltimeout却报错了,

这都是在一个Controller下面(我直接晕厥)–目前还没有找到原因,先说解决方法

解决方法

使用ApplicationContextAware,它实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来

修改后的代码

@RestController
@Slf4j
@SuppressWarnings({"all"})
@CrossOrigin
@RequestMapping("/journal")
@Component
public class JournalController implements ApplicationContextAware {

  	private static ApplicationContext context;

  	@Override
  	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 	{
        context = applicationContext;
   	}
    
    public static ApplicationContext getApplicationContext() {
        return context;
    }

    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    
    
       /**
     * 每周日将签到时间数据清空
     */
    @Scheduled(cron = "0 0 0 * * SUN")
    public void journaltimeout() {
        Journal_timeMapper journal_timeMapper = (Journal_timeMapper)this.getBean("journal_timeMapper");
        List<Journal_time> journal_times = journal_timeMapper.selectList(null);
        for (Journal_time journal_time : journal_times) {
            journal_time.setDay_time("0小时0分钟");
            journal_time.setWeek_time("0小时0分钟");
            journal_time.setAll_time("0小时0分钟");
            journal_time.setWeek_time_desc("第0名");
            journal_timeMapper.updateById(journal_time);
        }
    }


    /**
     * 每天晚上将一天签到数据清空
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void daytimeout() {
        Journal_timeMapper journal_timeMapper = (Journal_timeMapper)this.getBean("journal_timeMapper");
        List<Journal_time> journal_times = journal_timeMapper.selectList(null);
        for (Journal_time journal_time : journal_times) {
            journal_time.setDay_time("0小时0分钟");
            journal_timeMapper.updateById(journal_time);
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中将@Bean方法解析为BeanDefinition详解

    SpringBoot中将@Bean方法解析为BeanDefinition详解

    这篇文章主要介绍了SpringBoot中将@Bean方法解析为BeanDefinition详解,得到的BeanDefinition是ConfigurationClassBeanDefinition类型,会为BeanDefinition设置factoryMethodName,这意味着当实例化这个bean的时候将采用工厂方法,需要的朋友可以参考下
    2023-12-12
  • Java SSM框架如何配置静态资源加载

    Java SSM框架如何配置静态资源加载

    这篇文章主要介绍了Java SSM框架如何配置静态资源加载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JAVA Future类的使用详解

    JAVA Future类的使用详解

    这篇文章主要介绍了JAVA Future类的使用详解,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • 使用@RequestParam设置默认可以传空值

    使用@RequestParam设置默认可以传空值

    这篇文章主要介绍了使用@RequestParam设置默认可以传空值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis拦截器:给参数对象属性赋值的实例

    MyBatis拦截器:给参数对象属性赋值的实例

    下面小编就为大家带来一篇MyBatis拦截器:给参数对象属性赋值的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MapStruct对象映射转换解决Bean属性拷贝性能问题

    MapStruct对象映射转换解决Bean属性拷贝性能问题

    无意间看到项目中有小伙伴用到了 MapStruct 来做对象映射转换当时我就很好奇,这个是什么框架,能够解决什么问题,带着这两个疑问就有了下面的文章
    2022-02-02
  • 详解springboot的多种配置方式

    详解springboot的多种配置方式

    这篇文章主要介绍了springboot的多种配置方式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot中Dozer的使用小结

    SpringBoot中Dozer的使用小结

    dozer是用来两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的set和get方法了,下面介绍下SpringBoot中Dozer的使用,感兴趣的朋友一起看看吧
    2022-03-03
  • SpringBoot启动失败的原因及其解决方法

    SpringBoot启动失败的原因及其解决方法

    对于springboot的启动失败,相信大家都有经历,但是为什么会启动失败,以及怎么解决都只能通过日志进行查看,在这里,我会将常见的springboot启动失败的报错一一展示,需要的朋友可以参考下
    2024-06-06
  • java压缩多个文件并且返回流示例

    java压缩多个文件并且返回流示例

    这篇文章主要介绍了java压缩多个文件并且返回流示例,返回压缩流主是为了在程序里再做其它操作,需要的朋友可以参考下
    2014-03-03

最新评论