Java 停止当前线程&;等待HTTP连接

Java 停止当前线程&;等待HTTP连接,java,http,thread-sleep,Java,Http,Thread Sleep,我在一个依赖于到远程服务器的HTTP连接的线程中运行一些逻辑。当前,如果远程服务器未运行,线程将崩溃。我想修改逻辑,以便线程等待远程服务器再次可用 从技术上讲,解决方案似乎是遥遥无期的。大致如下: boolean reconnect = false; while (!reconnect) { try { URL url = new URL("m

我在一个依赖于到远程服务器的HTTP连接的线程中运行一些逻辑。当前,如果远程服务器未运行,线程将崩溃。我想修改逻辑,以便线程等待远程服务器再次可用

从技术上讲,解决方案似乎是遥遥无期的。大致如下:

                boolean reconnect = false;

                while (!reconnect) {
                    try {
                        URL url = new URL("my.remoteserver.com");
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.connect();
                        reconnect = true;
                    } catch (Exception ex) {
                        // wait a little, since remote server seems still down
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e1) {
                            // if thread was interrupted while waiting then terminate thread
                            break;
                        }
                    }
                }

然而,这个解决方案不是很优雅。而且,这个用例看起来非常通用,我怀疑这可以通过一些有用的库来实现。唉,我找不到任何人-谁能告诉我如何改进我的解决方案?

Camel为此类用例提供支持:


然而,它更像是一个构建数据流/事件驱动应用程序的框架,因此重试与http服务器的连接可能是一个巨大的挑战。但是,如果它适合应用程序,它将是一个很好的库/框架来移动数据。

我认为这个用例非常简单,可以自己实现,而不是引入额外的依赖项。如果您担心您的解决方案不够优雅,我建议将其重构为两个较小的方法,例如:

public void connect() {
    try {
        connectWithRetries();
    } catch (InterruptedException e) {
        // Continue execution
    }
}

private void connectWithRetries() throws InterruptedException {
    while (!tryConnect()) {
        sleep();
    }
}

private boolean tryConnect() {
    try {
        URL url = new URL("my.remoteserver.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.connect();
    } catch (Exception e) {
        return false;
    }
    return true;
}

private void sleep() throws InterruptedException {
    Thread.sleep(5000);
}

您提供的代码足够小和简单。我认为用这种方式实现它比向库中引入依赖项要好。谢谢你的夸奖,但我对嵌套的try-catch不太满意;)请检查Apache http组件: