【问题标题】:With Heroku, how can I automatically start a Java app that doesn't bind to a port when the app is deployed?使用 Heroku,如何在部署应用程序时自动启动未绑定到端口的 Java 应用程序?
【发布时间】:2015-11-21 19:01:37
【问题描述】:

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

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

我尝试使用不同的进程名称(例如“bot”)作为进程类型,但一段时间后,由于没有运行 Web 进程,我收到“没有运行 Web 进程”错误。此外,在这种情况下,用户必须使用 Heroku 网站或命令行工具手动启动“bot”进程。

有没有一种方法可以设置它,这样它就不会抱怨我没有绑定到一个端口并且没有一个 Web 进程,而是当有人部署它时它也会自动启动?

编辑:我发现我可以通过告诉它不要期望任何 web dynos 来摆脱“没有运行 web 进程”错误。我什至可以使用未记录的 app.json 属性来实现:

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

但是,他们仍然必须手动启动机器人进程。我也不想使用无证财产。如果我不使用它,他们必须在部署后使用命令行来修改应用程序。仍然没有找到让它自动启动的方法。

【问题讨论】:

    标签: java heroku websocket slack-api


    【解决方案1】:

    这有点小技巧,但您可以使用“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​​ 命令后面的“&”

    【讨论】:

    • 实际上,由于该应用程序没有前端,因此您可以使用简单的 ruby​​ Web 服务器显示带有一些说明或链接的 index.html。
    【解决方案2】:

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

    worker: java -jar myapp.jar
    

    然后相应地放大:

    heroku ps:scale worker=1
    

    仅需要“网络”测功机才能绑定到端口。

    您也可以从仪表板扩大规模。

    【讨论】:

    • 啊,刚刚注意到您希望它与 Heroku 按钮一起使用。我认为没有办法强制这样做。但“管理应用”按钮会将您带到仪表板。
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2012-12-10
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多