java - 托管在 Heroku 上的 Spring Boot 项目 - Web 进程在启动后 90 秒内无法绑定(bind)到 $PORT

标签 java spring-boot maven heroku

我在 stackoverflow 上阅读了许多类似的问题,但没有任何帮助。
我创建了一个 spring boot maven 后端项目并托管在 heroku 上。
但是,当我尝试从前端调用时,它会在浏览器中显示这样的错误。GET https://hoyamu-springboot-backend.herokuapp.com/fetch/bag 503 当我查看 heroku 的日志时,它会显示这样的错误。 Web process failed to bind to $PORT within 90 seconds of launch .我做了一切,但没有任何效果。
我的文件如下,
Heroku 应用程序日志

020-08-08T21:32:21.232432+00:00 heroku[web.1]: State changed from crashed to starting
2020-08-08T21:32:25.103258+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=48348 $JAVA_OPTS -jar target/hoyamu-0.0.1-SNAPSHOT.jar`
2020-08-08T21:32:27.226023+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2020-08-08T21:32:27.230034+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 
2020-08-08T21:32:28.818160+00:00 app[web.1]: 
2020-08-08T21:32:28.818210+00:00 app[web.1]:   .   ____          _            __ _ _
2020-08-08T21:32:28.818211+00:00 app[web.1]:  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2020-08-08T21:32:28.818214+00:00 app[web.1]: ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2020-08-08T21:32:28.818294+00:00 app[web.1]:  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2020-08-08T21:32:28.818323+00:00 app[web.1]:   '  |____| .__|_| |_|_| |_\__, | / / / /
2020-08-08T21:32:28.818414+00:00 app[web.1]:  =========|_|==============|___/=/_/_/_/
2020-08-08T21:32:28.819695+00:00 app[web.1]:  :: Spring Boot ::        (v2.2.6.RELEASE)
2020-08-08T21:32:28.819727+00:00 app[web.1]: 
2020-08-08T21:32:29.047717+00:00 app[web.1]: 2020-08-08 21:32:29.044  INFO 4 --- [           main] com.udith.hoyamu.HoyamuApplication       : Starting HoyamuApplication v0.0.1-SNAPSHOT on 50382c68-eaab-4b3c-ac0c-a881a18e4a0b with PID 4 (/app/target/hoyamu-0.0.1-SNAPSHOT.jar started by u8138 in /app)
2020-08-08T21:32:29.048863+00:00 app[web.1]: 2020-08-08 21:32:29.048  INFO 4 --- [           main] com.udith.hoyamu.HoyamuApplication       : No active profile set, falling back to default profiles: default
2020-08-08T21:32:30.083462+00:00 app[web.1]: 2020-08-08 21:32:30.081  INFO 4 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-08-08T21:32:30.224960+00:00 app[web.1]: 2020-08-08 21:32:30.224  INFO 4 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 130ms. Found 18 JPA repository interfaces.
2020-08-08T21:32:31.310818+00:00 app[web.1]: 2020-08-08 21:32:31.310  INFO 4 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 48348 (http)
2020-08-08T21:32:31.327532+00:00 app[web.1]: 2020-08-08 21:32:31.327  INFO 4 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-08T21:32:31.327720+00:00 app[web.1]: 2020-08-08 21:32:31.327  INFO 4 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-08-08T21:32:31.405048+00:00 app[web.1]: 2020-08-08 21:32:31.404  INFO 4 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-08T21:32:31.405289+00:00 app[web.1]: 2020-08-08 21:32:31.405  INFO 4 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2272 ms
2020-08-08T21:32:31.669531+00:00 app[web.1]: 2020-08-08 21:32:31.669  INFO 4 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-08-08T21:32:31.931057+00:00 app[web.1]: 2020-08-08 21:32:31.930  INFO 4 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
2020-08-08T21:32:32.109028+00:00 app[web.1]: 2020-08-08 21:32:32.108  INFO 4 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-08-08T21:32:32.249430+00:00 app[web.1]: 2020-08-08 21:32:32.249  INFO 4 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-08-08T21:32:33.786599+00:00 app[web.1]: 2020-08-08 21:32:33.786  INFO 4 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-08-08T21:32:33.850851+00:00 app[web.1]: 2020-08-08 21:32:33.850  INFO 4 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
2020-08-08T21:33:55.347291+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch
2020-08-08T21:33:55.368253+00:00 heroku[web.1]: Stopping process with SIGKILL
2020-08-08T21:33:55.465503+00:00 heroku[web.1]: Process exited with status 137
2020-08-08T21:33:55.499546+00:00 heroku[web.1]: State changed from starting to crashed

2020-08-08T21:50:58.187914+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/fetch/bag" host=hoyamu-springboot-backend.herokuapp.com request_id=db721f39-aab3-4a3f-82e9-6495dc6bc7a8 fwd="112.135.40.125" dyno= connect= service= status=503 bytes= protocol=https

文件 web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/hoyamu-0.0.1-SNAPSHOT.jar 应用程序属性
hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

spring.datasource.url=jdbc:mysql://remotemysql.com:3306/MMgqawaw
spring.datasource.username=username
spring.datasource.password=password

spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.show_sql=true
spring.jpa.hibernate.format_sql=true
spring.jpa.show-sql=true


```
What should I do?

最佳答案

经过几次小型调查,我可以找到解决问题的方法。
错误 Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch可能由于两个原因而发生。

  • 实际上应用程序无法绑定(bind)端口,因为它没有在 procfile 中正确定义。
    您可以通过阅读一些 stackoverflow 问题找到解决方案。
    简而言之,procfile 应该是这样的:

  • (部署后将 替换为您的应用名称)web: java $JAVA_OPTS -jar -Dserver.port=$PORT target/<BUILT_APP_NAME_HERE>.jar[或者]
    给出 * 时,不需要指定名称web: java $JAVA_OPTS -jar -Dserver.port=$PORT target/*.jar[或者]web: java $JAVA_OPTS -jar -Dspring.profiles.active=production target/<BUILT_APP_NAME_HERE>.jar --port $PORT
  • 第二个原因是,如错误所示,它尝试在启动 90 秒(对于某些应用程序为 60 秒)后绑定(bind)端口,即使应用程序尚未完全启动。默认情况下,对于 java 应用程序,heroku 将启动时间设置为 90 秒。如果 Heroku 在此期间无法绑定(bind)端口,则应用程序被标记为崩溃。
    在这里,在我的项目中,与远程数据库建立连接需要一点时间,但是 heroku 不会等到建立数据库连接,因为它的启动时间是 90 秒。

  • 解决方案是,我们必须增加应用程序的启动时间。您可以按照此链接执行此操作。 (这个链接有时候会报错,换个浏览器或者手机浏览器试试)
    https://tools.heroku.support/limits/boot_timeout
    但是,不建议将启动时间增加 120 秒以上。
    但是,在实际情况下,您应该找到为什么需要花费大量时间来建立数据库连接的解决方案。

    关于java - 托管在 Heroku 上的 Spring Boot 项目 - Web 进程在启动后 90 秒内无法绑定(bind)到 $PORT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63320589/

    相关文章:

    java - 使用变量类名而不是大量的 if 子句?

    java - DispatcherServletRegistration Spring启动异常

    java - 在 Spring Boot 中记录请求负载

    scala:console 比 Scala 自己的 REPL 还差?

    java - 操作系统版本范围的 Maven 配置文件

    java - 在java中使用Prepared Statement创建动态名称表

    java - 是否可以在 Amazon S3 上压缩目录,而不是下载 -> zip -> 上传

    java - 为 bearer auth 添加 swagger 注释

    java - Spring Boot 数据未从事件监听器中保存

    java - 为什么 OpenJDK 8 在使用 Docker 时没有提取正确的 JavaFX 库?