java - 如果 web 服务在 1 秒内没有响应超时,则返回 null
问题描述
public String getUldState(String uldNumber) throws SystemException {
ProvideULDinformationRequest wsRequest = new ProvideULDinformationRequest();
wsRequest.setIdcode(uldNumber);
ProvideULDinformationResponse uldInfo = null;
try {
uldInfo = service.provideULDinformation(wsRequest);
} catch (ProvideULDinformationBusinessException e) {
e.printStackTrace();
}
if (uldInfo != null) {
return uldInfo.getUldPhysicalStatus();
}
return null;
}
如果 Web 服务提供ULD 信息在一秒钟后没有响应,我想返回 null 。
解决方案
一种方法是CompletableFuture<>
用来做超时。
首先将您的实际代码包装到一个私有方法中:
private String getUldStatePrivate(String uldNumber) throws SystemException {
ProvideULDinformationRequest wsRequest = new ProvideULDinformationRequest();
wsRequest.setIdcode(uldNumber);
ProvideULDinformationResponse uldInfo = null;
try {
uldInfo = service.provideULDinformation(wsRequest);
} catch (ProvideULDinformationBusinessException e) {
e.printStackTrace();
}
if (uldInfo != null) {
return uldInfo.getUldPhysicalStatus();
}
return null;
}
然后从您的控制器调用它:
public String getUldState(String uldNumber) {
CompletableFuture<String> response = CompletableFuture.supplyAsync(() -> getUldStatePrivate(uldNumber));
try {
return response.get(1, TimeUnit.SECONDS);
} catch(TimeoutException ex) {
// timeout, log error, return
return null
}
}
在 Java 7 中,您可以使用 plain FutureTask
:
ExecutorService pool = Executors.newFixedThreadPool(10);
public String getUldState(String uldNumber) {
FutureTask<String> response = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return getUldStatePrivate(uldNumber);
}
});
pool.execute(response);
try {
return response.get(1, TimeUnit.SECONDS);
} catch(TimeoutException ex) {
// timeout, log error, return
return null
}
}
推荐阅读
- django - 如何允许管理员维护此模型上的内容
- c# - MVC-如何使用 Linq ASP.NET MVC 连接两个表或模型?
- r - 应用`all`函数的更快方法?
- javascript - Nodejs 超出最大调用堆栈大小
- java - 在菜单中选择项目时如何更改本地语言?
- swift - 将 SwiftUI CalloutView 添加到 MapKit
- php - 如何在php中将文件转换为zip
- android - 如何跟踪 WebRTC 远程 VideoStream 的分辨率/纵横比?
- java - 身份验证后如何将用户数据存储到 Firbase 数据库中?
- spring-boot - 使用 Aspectj 指向扩展类方法的切入点