You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:07:37