繁体   English   中英

错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT - Heroku

[英]Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch - Heroku

我正在尝试在 heroku 上部署我的服务器。 我收到此错误:

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

这是我的 Java 类:

package introsde.document.endpoint;
import javax.xml.ws.Endpoint;

import introsde.assignment.soap.PeopleImpl;

public class PeoplePublisher {
public static String SERVER_URL = "http://localhost";
public static String PORT = "6902";
public static String BASE_URL = "/ws/people";

public static String getEndpointURL() {
    return SERVER_URL+":"+PORT+BASE_URL;
}

public static void main(String[] args) {
    String endpointUrl = getEndpointURL();
    System.out.println("Starting People Service...");
    System.out.println("--> Published at = "+endpointUrl);
    Endpoint.publish(endpointUrl, new PeopleImpl());
}
}

我怎么解决这个问题?

谢谢

我在尝试创建一个最小的 spring-boot 应用程序时遇到了同样的问题。 我已经将 heroku 的 java-getting-started 实现与我的进行了比较,发现了这个很好的修复。 只需将此添加到src/main/resources/application.properties

server.port=${PORT:5000}

我在端口绑定方面遇到了同样的问题。 然后我发现了这篇很棒的文章,在那里我了解了在 Heroku 上部署时一切实际上是如何工作的。 阅读后,我设法在 2 分钟内解决了我的问题。 该链接已失效,但可以在此处找到存档链接。

简单的解决方案:

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/myapi-1.0.0.jar

myapi-1.0.0替换为您的 jar 名称或使用*

注意:变量的顺序很重要。 例如:以下不起作用。

web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/myapi-1.0.0.jar

您必须绑定到 Heroku 分配给您的端口作为 env var $PORT和主机0.0.0.0 因此,您应该更改代码以包含以下内容:

public static String PORT = System.getenv("PORT");

SERVER_URL部分可能更棘手。 您可以使用 0.0.0.0,但如果您确实需要可公开访问的 URL,则需要设置如下内容(将“yourappname”更改为您的应用程序名称):

$ heroku config:set SERVER_URL="https://yourappname.herokuapp.com"

然后添加代码:

public static String SERVER_URL = System.getenv("SERVER_URL");

另外,我想添加以下内容到 Procfile,允许我将 Spring boot 应用程序部署到 heroku 并解决您上面描述的异常:

worker: java $JAVA_OPTS -jar target/myTargetJar-SNAPSHOT.jar

网上列出的所有解决方案都没有帮助我解决问题,这就是为什么我决定在这里发布对我有帮助的解决方案。 不过可能不准时:)

为自己尝试了一切。 @fortellao 的回答对我来说是一个救星。 如果有人像我一样使用 src/main/resources/ application.yml,只需添加一点:

app:
  server:
    port: {$PORT}

端口: 5000 在我的情况下起到了作用。

由于您的这不是 Spring Boot 应用程序,因此您应该执行以下操作:

package introsde.document.endpoint;
import javax.xml.ws.Endpoint;

import introsde.assignment.soap.PeopleImpl;

public class PeoplePublisher {
public static String SERVER_URL = "http://localhost";
public String port;
public static String BASE_URL = "/ws/people";

public static String getEndpointURL() {
    return SERVER_URL+":"+port+BASE_URL;
}

public static void main(String[] args) {

    port = Integer.valueOf(args[0]);

    String endpointUrl = getEndpointURL();
    System.out.println("Starting People Service...");
    System.out.println("--> Published at = "+endpointUrl);
    Endpoint.publish(endpointUrl, new PeopleImpl());
}
}

然后在您的 Procfile 上:

web: java $JAVA_OPTS -jar target/*.jar $PORT

这样你就可以将你的套接字绑定到 Heroku 期望你监听的端口。

您可能在不等待服务器完成运行的情况下发出请求,因此它会中断,因为无法在 90 秒之前完成构建。

这是这里发生的猜测。

当 Heroku 找不到 Procfile 中指定的端口时会出现此问题。

这个问题的一个简单解决方案是通过 Procfile 动态地进行端口设置。

添加 Procfile ->

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/nome_do_meu_app.jar

请记住,Maven 打包应该是 JAR。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM