当前位置: 首页 > 知识库问答 >
问题:

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

况承福
2023-03-14

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

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

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

有没有一种方法可以设置它,使它不会抱怨我没有绑定到端口,没有web进程,而是在有人部署它时自动启动?

编辑:我发现我可以通过告诉它不要期待任何网络动态来消除“No web process running”错误。我甚至可以使用未记录的应用程序。json属性来实现这一点:

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

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

共有2个答案

封梓
2023-03-14

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

worker: java -jar myapp.jar

然后相应放大:

heroku ps:scale worker=1

只有“Web”测功机需要绑定到端口。

您还可以从仪表板将其放大。

田冥夜
2023-03-14

这有点黑客行为,但是您可以使用“Web”过程类型,并在Java进程的同时启动一个简单的Web服务器。例如:

web: sh start.sh

然后添加一个开始。sh脚本到您的项目,如下所示:

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

java -jar myapp.jar

注意“

 类似资料:
  • [错误]无法执行目标组织。阿帕奇。专家插件:maven编译器插件:3.8。1:在project Divi up后端上编译(默认编译):编译时出现致命错误:目标版本无效:15- 我得到了上面的错误,有人知道为什么会这样吗?

  • 我运行< code>heroku open时出现应用程序错误。我查了日志,这是: 2016-06-19T05:22:44.640391 00:00 heroku[路由器]:at=错误代码=H10 desc=“应用程序崩溃”方法=获取路径=“/”主机=drawparty-.herokuapp。com request_id=6712804b-95f9-49ce-92a5-7f45df7bb79e fw

  • 我有一个Java web应用程序,在我的jar文件中嵌入了Tomcat。我可以用Docker容器化应用程序,并用命令java-jar-myapp.jar运行它,但我不能在Heroku中运行那个容器。我尝试使用heroku CLI进行dockerize和部署,但heroku给了我一个“无法访问jarfile”的错误。 我试图通过使用heroku deploy:jar部署我的fat jar来解决这个问

  • 我有一份Java申请。 应用程序有一个决定应用程序是否在启动时启动的设置。 目前,我通过在StartUp items文件夹中放置/删除快捷方式实现了这一点。 然而,我想知道是否有更好的方法来处理这种行为。 编辑 是的,是视窗。抱歉之前没有清除。 应用程序有一个UI,用户可以在其中触发操作,并且应用程序在运行时定期在后台运行一些任务。 @Peter,如何使用应用程序中的代码更改注册表?这种方法是否与

  • 问题内容: 我有一个Java应用程序。 该应用程序具有一个设置,该设置决定该应用程序是否在启动时启动。 目前,我可以通过在“启动项目”文件夹中放置/删除快捷方式来实现此目的。 但是,我想知道是否有更好的方法来处理此行为。 编辑 是的,它是Windows。抱歉,之前没有清除该内容。 该应用程序具有一个用户可以在其中触发动作的UI,并且该应用程序在运行时会定期在后台运行一些任务。 @Peter,如何在

  • 在LXD容器中,应用程序应该如何编写脚本/自动部署? 例如,在LXD容器中部署应用程序的最佳方法是使用bash脚本(它部署应用程序)?如何通过在主机上执行命令在容器内执行此bash脚本? 有没有任何工具/方法可以以类似于Docker食谱的方式做到这一点?