Java案例如何实现服务超时?

wen python案例 1

本文目录导读:

Java案例如何实现服务超时?

  1. Future + Timeout(基础方案)
  2. CompletableFuture + orTimeout(JDK 9+)
  3. 线程池 + FutureTask(可控性强)
  4. Hystrix(服务熔断)
  5. Spring @Async + Future(Spring项目)
  6. HTTP调用超时(HTTP客户端)
  7. 最佳实践建议

在Java中实现服务超时控制,主要有以下几种常用方案,适用于不同场景:

Future + Timeout(基础方案)

适用于简单的单线程超时控制。

import java.util.concurrent.*;
public class FutureTimeoutExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(() -> {
            // 模拟耗时操作
            Thread.sleep(5000);
            return "服务调用成功";
        });
        try {
            // 设置超时时间2秒
            String result = future.get(2, TimeUnit.SECONDS);
            System.out.println(result);
        } catch (TimeoutException e) {
            System.out.println("服务超时!");
            future.cancel(true); // 取消任务
        } catch (Exception e) {
            System.out.println("服务异常:" + e.getMessage());
        } finally {
            executor.shutdown();
        }
    }
}

CompletableFuture + orTimeout(JDK 9+)

更灵活的异步编程方案。

import java.util.concurrent.*;
public class CompletableFutureTimeoutExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return "任务被中断";
            }
            return "服务调用成功";
        });
        // JDK 9+ 提供 orTimeout 方法
        CompletableFuture<String> timeoutFuture = future
            .orTimeout(2, TimeUnit.SECONDS)
            .exceptionally(throwable -> {
                if (throwable instanceof TimeoutException) {
                    return "服务超时!";
                }
                return "服务异常:" + throwable.getMessage();
            });
        try {
            String result = timeoutFuture.get();
            System.out.println(result);
        } catch (Exception e) {
            System.out.println("获取结果异常:" + e.getMessage());
        }
    }
}

线程池 + FutureTask(可控性强)

适用于需要精细控制线程池的场景。

import java.util.concurrent.*;
public class ThreadPoolTimeoutExample {
    private static final ExecutorService executor = 
        new ThreadPoolExecutor(
            2, 5, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(10),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
    public static void main(String[] args) {
        FutureTask<String> task = new FutureTask<>(() -> {
            Thread.sleep(5000);
            return "服务调用成功";
        });
        executor.execute(task);
        try {
            String result = task.get(2, TimeUnit.SECONDS);
            System.out.println(result);
        } catch (TimeoutException e) {
            System.out.println("服务超时!");
            task.cancel(true);
        } catch (Exception e) {
            System.out.println("服务异常:" + e.getMessage());
        } finally {
            executor.shutdown();
        }
    }
}

Hystrix(服务熔断)

适用于微服务场景,提供更完善的容错机制。

import com.netflix.hystrix.*;
public class HystrixTimeoutExample extends HystrixCommand<String> {
    protected HystrixTimeoutExample() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
            .andCommandPropertiesDefaults(
                HystrixCommandProperties.Setter()
                    .withExecutionTimeoutInMilliseconds(2000) // 超时时间2秒
                    .withExecutionIsolationStrategy(
                        HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
            ));
    }
    @Override
    protected String run() throws Exception {
        // 模拟耗时操作
        Thread.sleep(5000);
        return "服务调用成功";
    }
    @Override
    protected String getFallback() {
        return "服务超时,执行降级逻辑";
    }
    public static void main(String[] args) {
        HystrixTimeoutExample command = new HystrixTimeoutExample();
        String result = command.execute();
        System.out.println(result);
    }
}

Spring @Async + Future(Spring项目)

适用于Spring框架项目。

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@Service
public class TimeoutService {
    @Async
    public Future<String> callService() {
        try {
            Thread.sleep(5000);
            return new AsyncResult<>("服务调用成功");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return new AsyncResult<>("任务被中断");
        }
    }
    // 调用示例
    public void executeWithTimeout() throws Exception {
        Future<String> future = callService();
        try {
            String result = future.get(2, TimeUnit.SECONDS);
            System.out.println(result);
        } catch (TimeoutException e) {
            System.out.println("服务超时!");
            future.cancel(true);
        }
    }
}

HTTP调用超时(HTTP客户端)

适用于HTTP服务调用场景。

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class HttpTimeoutExample {
    public static String callHttpService(String urlStr) throws Exception {
        URL url = new URL(urlStr);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // 设置超时时间
        connection.setConnectTimeout(5000);  // 连接超时5秒
        connection.setReadTimeout(3000);     // 读取超时3秒
        connection.setRequestMethod("GET");
        int responseCode = connection.getResponseCode();
        if (responseCode == 200) {
            BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            in.close();
            return content.toString();
        }
        return null;
    }
}

最佳实践建议

  1. 选择合适的方案

    • 简单场景:Future + Timeout
    • 微服务:Hystrix或Resilience4j
    • Spring项目:@Async + Future
  2. 超时时间设置

    • 根据业务特点设置合理的超时时间
    • 考虑网络延迟、服务处理时间等因素
  3. 资源管理

    • 及时取消超时任务,释放资源
    • 合理配置线程池大小
  4. 降级处理

    • 超时时提供降级逻辑
    • 记录超时日志用于监控
  5. 监控告警

    • 建立超时监控机制
    • 设置合适的告警阈值

选择哪种方案取决于你的具体场景:如果是简单的单线程调用,Future + Timeout就足够;如果是微服务架构,建议使用Hystrix或Resilience4j等成熟的框架。

抱歉,评论功能暂时关闭!