ITPub博客

首页 > 应用开发 > Java > java网络请求的超时与重试解决方案

java网络请求的超时与重试解决方案

原创 Java 作者:mingtian66 时间:2024-10-10 09:46:12 0 删除 编辑

在Java中,处理网络请求时的超时和重试可以使用 HttpURLConnection 或更现代的库如 Apache HttpClient 或 OkHttp。以下是一些常见的解决方案。
使用 HttpURLConnection

java

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpRequest {
    public static void main(String[] args) {
        String urlString = "https://example.com";
        int maxRetries = 3;

        for (int i = 0; i < maxRetries; i++) {
            try {
                HttpURLConnection connection = (HttpURLConnection) new URL(urlString).openConnection();
                connection.setConnectTimeout(5000); // 连接超时
                connection.setReadTimeout(5000);    // 读取超时
                connection.setRequestMethod("GET");

                int responseCode = connection.getResponseCode();
                if (responseCode == 200) {
                    System.out.println("请求成功!");
                    break; // 成功,退出重试
                }
            } catch (IOException e) {
                System.out.println("请求失败,重试 " + (i + 1) + "...");
            }
        }
    }
}

使用 Apache HttpClient

xml

<!-- 在pom.xml中添加依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

java

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientRequest {
    public static void main(String[] args) {
        String url = "https://example.com";
        int maxRetries = 3;

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            for (int i = 0; i < maxRetries; i++) {
                try {
                    HttpGet request = new HttpGet(url);
                    request.setConfig(RequestConfig.custom()
                        .setConnectTimeout(5000)
                        .setSocketTimeout(5000)
                        .build());

                    CloseableHttpResponse response = httpClient.execute(request);
                    if (response.getStatusLine().getStatusCode() == 200) {
                        String responseBody = EntityUtils.toString(response.getEntity());
                        System.out.println("请求成功:" + responseBody);
                        break;
                    }
                } catch (IOException e) {
                    System.out.println("请求失败,重试 " + (i + 1) + "...");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 OkHttp

xml

<!-- 在pom.xml中添加依赖 -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.2</version>
</dependency>

java

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpRequest {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();

        String url = "https://example.com";
        int maxRetries = 3;

        for (int i = 0; i < maxRetries; i++) {
            try {
                Request request = new Request.Builder().url(url).build();
                Response response = client.newCall(request).execute();

                if (response.isSuccessful()) {
                    System.out.println("请求成功:" + response.body().string());
                    break; // 成功,退出重试
                }
            } catch (IOException e) {
                System.out.println("请求失败,重试 " + (i + 1) + "...");
            }
        }
    }
}

重点

    超时设置:通过设置连接超时和读取超时来确保请求不会无限等待。
    重试机制:在捕获异常时进行重试,通常建议设置最大重试次数。
    异常处理:确保适当处理可能的网络异常。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040412/viewspace-3035733/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    589
  • 访问量
    602853