部署在Heroku的Java JDA Discord机器人运行90秒后离线如何解决
你遇到的R10错误本质是Heroku对web类型进程的强制校验要求——所有web进程必须在启动后90秒内绑定平台分配的$PORT端口用于对外提供HTTP服务,但Discord机器人属于后台服务,本身不需要监听任何HTTP端口,自然无法满足该校验要求,因此会被平台强制终止。
方案1:切换为Worker进程(最简方案)
这是最适配Discord机器人场景的解决方案,Heroku的worker类型进程无端口绑定要求,专门用于运行后台常驻服务。
- 修改
Procfile内容,将进程类型从web改为worker,同时删除无关的端口配置参数:
worker: java $JAVA_OPTS -jar build/libs/HerokuTestBot-1.0-all.jar $JAR_OPTS
- 进入Heroku应用的Resources配置页,关闭原来的
webdyno,启用新的workerdyno后重新部署即可。 system.properties中的server.port配置属于web服务相关配置,可直接删除,不影响机器人运行。
方案2:保留Web进程添加端口监听(仅当你需要同时提供HTTP服务时选用)
如果你确实需要保留web进程类型(比如需要对外提供健康检查、API接口等),可以在机器人启动代码中添加一个简单的HTTP服务器,监听Heroku分配的$PORT端口即可通过校验:
// 示例代码,在机器人启动逻辑中添加 import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.net.InetSocketAddress; // 启动时读取环境变量PORT int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080")); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); server.createContext("/", exchange -> { String response = "Bot is running"; exchange.sendResponseHeaders(200, response.getBytes().length); exchange.getResponseBody().write(response.getBytes()); exchange.close(); }); server.start();
内容的提问来源于stack exchange,提问作者XLoL2007
相关产品推荐
相关产品推荐

