将 sbt 项目部署到 heroku 时启动超时

Boot timeout when deploying an sbt project to heroku

我有一个用 Scala 编写的微服务,主要是 运行 的计划作业。这不是一个播放应用程序。主要功能只是设置预定的工作。例如

import cronish.dsl._

object workers {
  def main(args: Array[String]) : Unit = {
    val payroll: CronTask = task {
      println("Syncing Payroll...")
    }
    payroll executes "every 5 minutes"

  }
}

我将其部署到 Heroku,当作业按预期开始 运行 时,Heroku 在 60 秒后每次都会将其终止。

Syncing Payroll...
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Stopping process with SIGKILL
Process exited with status 137
State changed from starting to crashed

我关注了 official Heroku documentation。这是我的 build.sbt 的样子

name := "AppName"
version := "0.1"
scalaVersion := "2.11.9"
enablePlugins(JavaServerAppPackaging)

libraryDependencies += "com.smartsheet" % "smartsheet-sdk-java" % "2.2.2"
libraryDependencies += "com.github.philcali" %% "cronish" % "0.1.3"
libraryDependencies +=  "org.scalaj" %% "scalaj-http" % "2.3.0"
....

我也将两个 Heroku 插件添加到 plugins.sbt 文件

addSbtPlugin("com.heroku" % "sbt-heroku" % "2.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.1")

如果我使用 sbt 运行,它 运行 在开发方面完全没问题。我在想 Heroku 期望这个服务是一个网络服务器,所以它一直试图将它附加到一个开放的端口,但是因为这个服务不是一个网络服务器,所以它不能这样做。是否可以将此类微服务部署到 Heroku?是否需要使用自定义构建包?

您的 Procfile 应该使用 worker: 而不是 web:。例如:

worker: target/universal/stage/bin/{myAppName}

然后将 "worker" dynos 放大 运行:

$ heroku ps:scale worker=1

您可以随意命名该过程(不必是 "worker"),但是 "web" dynos 被特殊对待。 Heroku 希望它们绑定到一个端口并为网络请求提供服务。