使用 Heroku,如何在部署应用程序时自动启动未绑定到端口的 Java 应用程序?

With Heroku, how can I automatically start a Java app that doesn't bind to a port when the app is deployed?

我有一个 Java 应用程序(打包为 JAR),它通过 websockets 与聊天程序 (Slack) 交互。据我了解,我的应用不需要绑定到特定端口即可工作——它只是连接到 Slack 的实时消息 API。它不充当 Web 应用程序或 Web 服务器。它不会在任何端口上侦听传入请求,因为它不需要。我希望有人能够单击我的应用程序的 "Deploy to Heroku" 按钮,并且我希望 Java 应用程序在应用程序部署后立即 运行,而无需用户手动打开在启动 Java 应用程序的过程中。

我已经尝试使用 "web" 作为启动我的 Java 应用程序 (java -jar ...) 的进程类型,但是,正如您可能猜到的那样,因为我的应用程序使用 websockets,该应用程序在 60 秒后停止 运行ning,因为 Heroku 检测到它无法绑定到端口。

我尝试使用不同的进程名称,如 "bot" 作为进程类型,但是,一段时间后,我收到 "No web process running" 错误,因为没有网络进程是 运行宁。此外,在这种情况下,用户必须使用 Heroku 网站或命令行工具手动启动 "bot" 进程。

有没有一种方法可以设置它,使其不会抱怨我没有绑定到端口并且没有 Web 进程,但它也会在有人部署它时自动启动?

编辑:我发现我可以通过告诉它不要期望任何网络测功机来摆脱 "No web process running" 错误。我什至可以使用未记录的 app.json 属性 来实现此目的:

"formation": [
    { "process": "web",    "quantity": 0},
    { "process": "bot", "quantity": 1}
 ]

但是,他们仍然需要手动启动机器人进程。另外,我不希望使用未记录的 属性。如果我不使用它,他们必须在部署后使用命令行修改应用程序。还没有找到让它自动启动的方法。

在您的 Procfile 中,只需将进程类型命名为 "web" 以外的名称。例如:

worker: java -jar myapp.jar

然后相应地放大:

heroku ps:scale worker=1

只需要 "web" dynos 绑定到一个端口。

您还可以从仪表板中扩展它。

这有点 hack,但您可以使用 "web" proc 类型并在您的 Java 进程旁边启动一个简单的 Web 服务器。例如:

web: sh start.sh

然后像这样将 start.sh 脚本添加到您的项目中:

ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => ENV["PORT"], :DocumentRoot => Dir.pwd).start' &

java -jar myapp.jar

注意 ruby 命令后的“&”