最近项目中有一个需求需要一个存储过程不停的执行,但是存储过程执行中如果出现异常,自动通知管理员会很麻烦。所以打算直接把调用存储过程这步骤整合进Spring Boot项目中(这样不论异常捕获和邮件通知都相对简单)。
于是考虑使用实现Spring的InitializingBean,DisposableBean接口+新建一个线程来实现需求。思路为Spring Boot启动时初始化并执行该线程,然后线程中不停调用该存储过程,当然需要加上个缓冲时间,不然跑的太频繁。然后在Spring Boot项目关闭时销毁该线程。
1.首先新建InitCommon.java
实现InitializingBean,DisposableBean两个接口
@Component
public class InitCommon implements InitializingBean,DisposableBean{
@Resource
private MyThread myThread;
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
//项目关闭时执行的方法
System.out.println("thread 关闭");
myThread.interrupt();
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
//项目启动时执行的方法
System.out.println("thread 开始");
myThread.start();
}
}
2.MyThread.java
@Component
public class MyThread extends Thread{
@Override
public void run() {
while(true)
{
try {
System.out.println(new Date());
//所要进行的操作,我这里就是调用存储过程了。
//
MyThread.sleep(3000);//休眠3秒,避免执行过于频繁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
当然使用quartz和Spring Boot自带的@Scheduled这些定时任务组件也可以满足该需求,而且实际上的实现原理都是相同的。