hutool类可以直接用.timeout(毫秒)
例如:
String result2 = HttpRequest.post(url)
.header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
.form(paramMap)//入参内容
.timeout(20000)//超时,毫秒
.execute()
.body();
hutool官网地址: https://www.hutool.cn/docs/#/http/Http请求-HttpRequest
我这里用到的是Future接口与ExecutorService类:
为什么会用到: 在日常开发中,总是要和第三方对接,有的时候会出现接口调用超时的情况,我们可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。
怎么去理解: 就相当于我在店铺预定了一样东西,一段时间后我可以拿着订货单来提货,这期间我可以去做别的任何事情。其中Future接口就是订货单,真正处理此订单的是Executor类,它根据Future接口的要求来生产产品。
接口介绍:
Future接口是一个泛型接口,严格的格式应该是Future<V>,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:
- boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
- boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
- boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
- V get () throws InterruptedException, ExecutionException 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出
CancellationException
- V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException
示例:
Future的实现类有java.util.concurrent.FutureTask<V>即 javax.swing.SwingWorker<T,V>。通常使用FutureTask来处理我们的任务。
FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:
public boolean syncProcessStatus(String paramStr) {
String returnStr = "-1";
final ExecutorService exec = Executors.newSingleThreadExecutor();
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
String res = HttpRequest.post("url")
.header("Content-Type", "application/json")
.body(paramStr)
.execute().body();
logger.info("归档节点同步流程状态接口结果:" + res);
JSONObject resJson = JSONObject.parseObject(res);
return resJson.getInteger("errno").toString();
}
};
// Future是一个接口,该接口用来返回异步的结果
Future<String> future = exec.submit(call);
try {
// 同步结果,并且设置超时时间
returnStr = future.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
//接口超时 执行其他操作
insertRebackRecord(5, paramStr);
e.printStackTrace();
}
//执行结束后,手动关闭线程池
exec.shutdown();
return ("0").equals(returnStr);
}