tomcat执行shutdown后,spring的定时任务如何正确运行完成后才退出

路人甲陈惟鲜 2016-11-03 03:36:09
如题:tomcat执行shutdown后,spring的定时任务如何正确运行完成后才退出。
场景:我的服务器有一个tomcat专门用户跑定时任务,使用的是spring的@Scheduled来实现。
我要更新服务应用,然后执行了tomcat的shutdown,可是这个时候,我的定时任务中还有任务正在运行,正在处理数据。或者即将处理数据执行。
问题:我应该如何让task停止接收任务。同时让我正在运行的定时任务执行完成后,再停掉服务。

我看了下网上资料,说是这样可以监听到tomcat启动与关闭的通知。于是我想到一个比较笨的方法,定一个变量,
1、在我的每个定时任务前做一个开关,这个开关中有一个条件判断,如果是服务关闭的,那么就不在执行新的定时任务。
2、获取到这个变量是关闭的时候,我让线程休眠30秒,让我剩下的定时任务完成执行。。。

@Service
@WebListener
public class ShutdownListener implements ServletContextListener {

private Logger logger = Logger.getLogger(ShutdownListener.class);

@Override
public void contextDestroyed(ServletContextEvent event) {
String message = "服务关闭";
logger.info(message+ControllerContants.MESSAGE_START);
try {
Thread.sleep(30*1000);
} catch (InterruptedException e) {

}
logger.info(message+ControllerContants.MESSAGE_END);
}

@Override
public void contextInitialized(ServletContextEvent event) {}
}


请问:除了我的这个笨办法,弊端:30秒任务执行不完,怎么办。。还有没有其他办法,比如配置,标签什么的,让我的服务能完全停止掉后再关闭服务。
...全文
741 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人甲陈惟鲜 2016-11-04
  • 打赏
  • 举报
回复
我当前就这样干,将所有定时任务信息,启动时,都写入redis中。。 我看相关文档,没找到一次性获取所有定时任务计划信息的方法。。。
X元素 2016-11-03
  • 打赏
  • 举报
回复
考虑一下 把相关任务持久化, 以持久化的数据状态为标准(0未执行,1执行中,2执行异常 等等), 每次启动服务注册一遍相关的任务.

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧