基于Gradle与Spring Boot的Java Discord Bot部署Heroku时遭遇Error R10(启动超时)问题求助
搞定Heroku部署Discord Bot的Error R10问题
嘿,我一眼就看出问题出在哪了——你用错了Heroku的进程类型!
你的Discord Bot是个后台长期运行的服务,根本不需要监听HTTP端口,但你当前的Procfile用了web类型,Heroku对web进程有硬性要求:必须在90秒内绑定到$PORT环境变量指定的端口,不然就会触发R10超时杀进程。这就是为什么本地跑没问题,一上Heroku就挂的原因。
下面是具体的解决步骤,跟着做就行:
1. 把Procfile里的进程类型改成worker
原来的Procfile是给Web应用准备的,直接改成worker类型:
worker: java $JAVA_OPTS -jar build/libs/*.jar
这样Heroku就不会逼你的Bot绑定端口了,安心让它后台跑就行。
2. 去Heroku控制台开Worker Dyno
改完Procfile部署后,还得去Heroku后台开Worker进程:
- 打开你应用的「Resources」页面
- 找到Worker那一行,把开关打开(默认可能是关的)
- 顺便把Web Dyno的开关关掉吧,留着也是浪费资源
3. 代码小优化(可选,但更规范)
你的代码里用了不少block()同步等待,虽然不是导致R10的直接原因,但在Reactor生态里更推荐用非阻塞的方式。比如把最后一行的:
client.onDisconnect().block();
换成:
client.onDisconnect().blockLast();
这样更符合Reactor的最佳实践,不过不改也能跑,看你自己需求。
再啰嗦两句为啥之前会错
Heroku的web进程是给Spring Boot Web应用这类需要对外提供HTTP服务的程序设计的,所以强制要求绑定端口。而你的Discord Bot只需要和Discord的网关保持连接,完全不需要开HTTP端口,用worker进程类型才是正确的选择。
另外,确认下你的Gradle构建确实把可执行jar包生成在build/libs/目录下了,如果有多个jar,最好写具体的文件名,比如discord-bot-1.0.0.jar,避免Heroku选错。
内容的提问来源于stack exchange,提问作者DanVP
相关产品推荐
相关产品推荐

