Java Interceptor 拦截器如何实现请求超时处理
在Java中,拦截器(Interceptor)通常用于在方法调用前后执行一些操作,例如日志记录、权限检查等。要实现请求超时处理,可以使用Java的Future和ExecutorService来控制异步任务的执行时间。以下是一个简单的示例:
- 首先,创建一个实现了
java.util.concurrent.Callable接口的类,这个类将包含实际的业务逻辑。
import java.util.concurrent.Callable;
public class MyTask implements Callable {
@Override
public String call() throws Exception {
// 实际的业务逻辑
Thread.sleep(5000); // 假设这是一个耗时5秒的操作
return "任务完成";
}
}
- 创建一个拦截器类,这个类将使用
ExecutorService来执行MyTask,并设置超时时间。
import java.util.concurrent.*;
public class TimeoutInterceptor {
private final ExecutorService executorService = Executors.newFixedThreadPool(10);
public String handleRequest(Callable task, long timeout, TimeUnit unit) {
Future future = executorService.submit(task);
try {
return future.get(timeout, unit);
} catch (TimeoutException e) {
future.cancel(true); // 超时后取消任务
return "请求超时";
} catch (InterruptedException | ExecutionException e) {
return "请求异常";
}
}
public void shutdown() {
executorService.shutdown();
}
}
- 在主程序中使用
TimeoutInterceptor来处理请求。
public class Main {
public static void main(String[] args) {
TimeoutInterceptor interceptor = new TimeoutInterceptor();
MyTask task = new MyTask();
long timeout = 3; // 设置超时时间为3秒
TimeUnit unit = TimeUnit.SECONDS;
String result = interceptor.handleRequest(task, timeout, unit);
System.out.println(result);
interceptor.shutdown();
}
}
在这个示例中,我们创建了一个TimeoutInterceptor类,它使用ExecutorService来执行MyTask。当调用handleRequest方法时,我们传入一个超时时间,如果任务在指定时间内完成,将返回任务结果;如果超时,将取消任务并返回"请求超时"。