future异步封装
说明: 我们一般使用 CompletableFuture+线程池 来进行实现异步任务,但是一般用于一些get()方法,过于单一,我们希望对此进行一些扩展,比如遇到超时或者执行报错的情况,就需要将原始数据返回,这些方面就需要对此进行封装!
工具类: CompletableFutureUtils
作用: 功能仅仅用于超时的时候返回默认值即可!
注意: 此处需要传入Logger是因为如果用CompletableFutureUtils的log来打印,那么其log信息全是这个工具类的了,我们就无法分清日志是具体哪个业务执行产生的;所以选择自行传入Logger,当要打印日志时候就进行使用,日志中变化携带调用类的信息,我们便一目了然!
public class CompletableFutureUtils {
public static <T> T getResult(Future<T> future, //具体执行方法函数
Long timeOut, //超时时间
TimeUnit timeUnit,
T defaultValue, //默认值
Logger logger //日志对象
) {
try {
return future.get(timeOut, timeUnit);
} catch (Exception e) {
logger.debug("CompletableFutureUtils.getResult.error:{}", e.getMessage(), e);
return defaultValue;
}
}
}
测试:
说明: 创建两个FutureTask,一个演示不超时,一个演示超时!
@Test
public void Test() {
List<FutureTask<String>> futureTaskList = new ArrayList<>();
FutureTask<String> futureTask1 = new FutureTask<>(() -> "ssm");
mailThreadPool.submit(futureTask1); //submit提交任务,底层包含了execut执行
String result = CompletableFutureUtils.getResult(futureTask1, 1L, TimeUnit.SECONDS, "默认值", log);
System.out.println(result);
FutureTask<String> futureTask2 = new FutureTask<>(() -> {
Thread.sleep(2000L); //模拟超时
return "ssy";
});
mailThreadPool.submit(futureTask2);
String result1 = CompletableFutureUtils.getResult(futureTask2, 1L, TimeUnit.SECONDS, "默认值", log);
System.out.println(result1);
}
}