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

标签 java heroku websocket slack-api

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

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

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

有没有一种方法可以设置它,这样它就不会提示我没有绑定(bind)到端口并且没有网络进程,但当有人部署它时它也会自动启动?

编辑:我发现我可以通过告诉它不要期待任何网络测功机来消除“没有网络进程正在运行”错误。我什至可以使用未记录的 app.json 属性来实现此目的:

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

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

最佳答案

这有点像黑客,但您可以使用“web”过程类型并在 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​​ 命令后面的“&”

关于java - 使用 Heroku,如何在部署应用程序时自动启动未绑定(bind)到端口的 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847364/

相关文章:

websocket - 这些数字在 socket.io 有效负载中意味着什么?

java - 数组未正确打印

ruby-on-rails-3 - 在 Heroku 中使用无用的 gem 扩展特定的 worker

go - WebSocket - 关闭握手 gorilla

ruby-on-rails - Github:克隆存储库、对克隆进行更改并提交到原始存储库

mysql - 如何告诉 heroku 为新创建的应用程序使用 rails 3 和 ruby​​ 1.9.2?

javascript - websocket onclose 未在 chrome 中触发 - linux 当客户端与网络断开连接时

java - 如何修改Intent中类的名称(变量而不是硬编码)?

java - 如果我需要的内存多于 Java 堆中的内存,我该怎么办?

java - Java 中抓取 html 页面源代码的问题