启动一个线程,每隔一段时间,调用外部接口后,将数据更新到数据库。
public class RefAnalysisResultThread implements Runnable {
private volatile boolean someCondition = true;
private IAnalysisService analysisService;
public RefAnalysisResultThread() {
this.analysisService = BeanContext.getApplicationContext().getBean(IAnalysisService.class);
}
@Override
public void run() {
while (someCondition) {
try {
analysisService.autoRefreshResultAnalysis();
// 间隔一段时间
Thread.sleep(600 * 1000);
} catch (Exception exception) {
log.error(exception);
}
}
}
}
BeanContext
@Component
public class BeanContext implements ApplicationContextAware {
// Spring应用上下文环境
private static ApplicationContext applicationContext;
/*
* 实现了ApplicationContextAware 接口,必须实现该方法;
* 通过传递applicationContext参数初始化成员变量applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanContext.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T)applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clz) throws BeansException {
return (T)applicationContext.getBean(clz);
}
}
Application 启动时,同时启动该线程
public static void main(String[] args) {
SpringApplication.run(AnApplication.class,args);
// 启动自动刷新分析状态的线程
new RefAnalysisResultThread().run();
}
但是运行当中,更新数据库时报错。
调用的是 updateById 方法
updateById(uAnalysis)
报错
2021-07-27 11:31:18.228 - Creating a new SqlSession
2021-07-27 11:31:18.228 - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1edbef47] was not registered for synchronization because synchronization is not active
2021-07-27 11:31:18.263 - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1edbef47]
2021-07-27 11:31:18.265 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.lang.NullPointerException
### The error may exist in com/abc/abc/mapper/AnalysisMapper.java (best guess)
### The error may involve com/abc/abc.mapper.AnalysisMapper.updateById
### The error occurred while executing an update
说是mapper文件的问题
经过测试,如果不在该线程里面调用 updateById 方法,是能成功的。
如果是启动了该线程,调用 updateById 方法,就报错。
最后使用了 UpdateWrapper ,使用 update(updateWrapper) 方法,更新数据库成功。