为何Quartz Scheduler在Heroku闲置30分钟后停止运行?
Heroku上Spring Boot调度服务与Web服务闲置后自动停止的问题
我正在基于Heroku的自定义时钟进程方案构建应用,和官方示例的唯一区别是:我的web服务仅返回"Hello World",调度服务仅负责打印当前时间。但遇到一个问题——闲置30分钟后,web服务和调度服务都会自动停止,相关日志如下:
2020-02-09T15:20:17.911457+00:00 app[scheduler.1]: 15:20:17.911 [SpringContextShutdownHook] INFO o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor' 2020-02-09T15:20:18.151399+00:00 app[web.1]: 15:20:18.151 [SpringContextShutdownHook] INFO org.quartz.core.QuartzScheduler - Scheduler quartzScheduler_$_NON_CLUSTERED paused. 2020-02-09T15:20:18.151689+00:00 app[web.1]: 15:20:18.151 [SpringContextShutdownHook] INFO o.s.s.quartz.SchedulerFactoryBean - Shutting down Quartz Scheduler 2020-02-09T15:20:18.151775+00:00 app[web.1]: 15:20:18.151 [SpringContextShutdownHook] INFO org.quartz.core.QuartzScheduler - Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. 2020-02-09T15:20:18.151840+00:00 app[web.1]: 15:20:18.151 [SpringContextShutdownHook] INFO org.quartz.core.QuartzScheduler - Scheduler quartzScheduler_$_NON_CLUSTERED paused. 2020-02-09T15:20:18.152244+00:00 app[web.1]: 15:20:18.152 [SpringContextShutdownHook] INFO org.quartz.core.QuartzScheduler - Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. 2020-02-09T15:20:18.152871+00:00 app[web.1]: 15:20:18.152 [SpringContextShutdownHook] INFO o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor' 2020-02-09T15:20:18.135436+00:00 heroku[web.1]: Stopping all processes with SIGTERM 2020-02-09T15:20:18.247822+00:00 heroku[web.1]: Process exited with status 143 2020-02-09T15:20:18.123889+00:00 heroku[scheduler.1]: Process exited with status 143
我的Procfile内容如下:
web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/*.jar scheduler: java $JAVA_OPTS -cp target/*.jar -Dloader.main=algotrading.app.scheduler.SchedulerApp org.springframework.boot.loader.PropertiesLauncher
想请教一下,是不是我遗漏了官方示例中的某些关键配置?
问题分析与解决方案
先看日志里的SIGTERM信号和退出状态143,这其实是Heroku免费/入门级dyno的自动休眠机制在起作用——这类dyno会在30分钟无请求后自动停止以节省资源。但你的调度服务也跟着停了,主要是这几个可能的问题:
- 调度服务未独立运行:官方示例里的clock进程是单独分配dyno运行的,你得确认有没有执行
heroku ps:scale scheduler=1来启动独立的调度dyno。如果没这么做,调度进程可能和web dyno绑定在一起,web休眠时它也会被一并终止。 - 调度应用未保持活跃:检查你的
SchedulerApp类,确保Spring Boot应用启动后不会自行退出。比如有没有添加@EnableScheduling注解开启定时任务?如果应用启动后没有持续运行的任务,主线程可能会直接结束,导致进程退出。 - web服务的休眠限制:这是免费dyno的默认规则,没法彻底规避,除非升级到付费dyno。如果只是测试用,你可以用第三方工具每隔25分钟ping一次web服务地址,让它保持活跃状态。
另外再核对下你的Procfile,格式是没问题的,但要确保algotrading.app.scheduler.SchedulerApp这个启动类路径正确,且类中配置了有效的定时任务逻辑,避免应用启动后无活可干而自动关闭。
内容的提问来源于stack exchange,提问作者Sixro
相关产品推荐
相关产品推荐

