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

时间:2015-11-21 19:01:38

标签: java heroku websocket slack-api

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

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

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

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

编辑:我发现我可以通过告诉它不要指望任何网络动态,摆脱“没有网络进程运行”错误。我甚至可以使用未记录的app.json属性来实现此目的:

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

但是,他们仍然需要手动启动僵尸程序。此外,我不想使用无证件的财产。如果我不使用它,他们必须使用命令行在部署后修改应用程序。仍然没有找到让它自动启动的方法。

2 个答案:

答案 0 :(得分:2)

这有点像黑客,但你可以使用" 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命令之后

答案 1 :(得分:1)

在Procfile中,只需将流程类型命名为“web”以外的其他类型。例如:

worker: java -jar myapp.jar

然后相应地扩大规模:

heroku ps:scale worker=1

只需要“web”dynos绑定到端口。

您还可以从信息中心进行缩放。