我有一个Java应用程序(打包为JAR),它通过websocket与聊天程序(Slack)交互。据我所知,我的应用程序不需要绑定到特定端口即可工作,只需连接到Slack的实时消息API即可。它不是一个web应用程序或web服务器。它不在任何端口上侦听传入请求,因为它不需要。我希望有人能够为我的应用程序单击"Deploy to Heroku"按钮,我希望Java应用程序在应用程序部署后立即运行,而无需用户手动打开启动Java应用程序的进程。
我尝试过使用"web"作为启动Java应用程序(Java-jar…)的进程类型,但是,正如你可能猜到的,由于我的应用程序使用websockets,该应用程序在60秒后停止运行,因为Heroku检测到它无法绑定到端口。
我曾尝试使用不同的进程名称,如"bot"作为进程类型,但一段时间后,我收到了一个"无网络进程运行"错误,因为没有网络进程运行。此外,在这种情况下,用户必须使用Heroku网站或命令行工具手动启动"机器人"程序。
有没有一种方法可以设置它,这样它就不会抱怨我没有绑定到端口,也没有web进程,但当有人部署它时,它也会自动启动?
编辑:我发现我可以通过告诉它不要期待任何网络dynos来消除"没有网络进程运行"的错误。我甚至可以使用一个未记录的app.json属性来实现这一点:
"formation": [
{ "process": "web", "quantity": 0},
{ "process": "bot", "quantity": 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命令后面的"&"
在Procfile中,只需将流程类型命名为"web"以外的名称即可。例如:
worker: java -jar myapp.jar
然后相应地放大:
heroku ps:scale worker=1
只有"web"dynos才需要绑定到端口。
您也可以从仪表板中放大它。