如何解決SpringBoot定時任務(wù)報錯Unexpected error occurred in scheduled task問題
問題
spring boot項目在線上一直正常運行沒有錯誤,然后今天發(fā)生了報錯,如圖

這是一個定時器錯誤,發(fā)生這個報錯
主要有兩個原因
- 定時器編寫的有錯誤
- @Scheduled注解方式級別高于資源注入級別,導(dǎo)致了資源注入失敗
以下是我的代碼
@RestController
@Slf4j
@SuppressWarnings({"all"})
@CrossOrigin
@RequestMapping("/journal")
@Component
public class JournalController {
@Autowired
Journal_timeMapper journal_timeMapper;
/**
* 每周日將簽到時間數(shù)據(jù)清空
*/
@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);
}
}
/**
* 每天晚上將一天簽到數(shù)據(jù)清空
*/
@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,它實現(xiàn)了這個接口的bean,當(dāng)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);
}
/**
* 每周日將簽到時間數(shù)據(jù)清空
*/
@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);
}
}
/**
* 每天晚上將一天簽到數(shù)據(jù)清空
*/
@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);
}
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringBoot使用@Scheduled實現(xiàn)定時任務(wù)的并行執(zhí)行
- springboot定時任務(wù)SchedulingConfigurer異步多線程實現(xiàn)方式
- xxl-job定時任務(wù)配置應(yīng)用及添加到springboot項目中實現(xiàn)動態(tài)API調(diào)用
- SpringBoot中實現(xiàn)定時任務(wù)的4種方式詳解
- SpringBoot集成xxl-job實現(xiàn)超牛的定時任務(wù)的步驟詳解
- SpringBoot實現(xiàn)設(shè)置動態(tài)定時任務(wù)的方法詳解
- SpringBoot中實現(xiàn)定時任務(wù)的幾種方式
- Spring Boot 中啟用定時任務(wù)的操作方法
相關(guān)文章
SpringBoot中將@Bean方法解析為BeanDefinition詳解
這篇文章主要介紹了SpringBoot中將@Bean方法解析為BeanDefinition詳解,得到的BeanDefinition是ConfigurationClassBeanDefinition類型,會為BeanDefinition設(shè)置factoryMethodName,這意味著當(dāng)實例化這個bean的時候?qū)⒉捎霉S方法,需要的朋友可以參考下2023-12-12
MapStruct對象映射轉(zhuǎn)換解決Bean屬性拷貝性能問題
無意間看到項目中有小伙伴用到了 MapStruct 來做對象映射轉(zhuǎn)換當(dāng)時我就很好奇,這個是什么框架,能夠解決什么問題,帶著這兩個疑問就有了下面的文章2022-02-02

