Java 如果webservice在1秒内没有响应,则超时,然后返回null

Java 如果webservice在1秒内没有响应,则超时,然后返回null,java,multithreading,web-services,jakarta-ee,timeout,Java,Multithreading,Web Services,Jakarta Ee,Timeout,如果web服务提供的信息在一秒钟后没有响应,我想返回null。一种方法是使用CompletableFuture执行超时 首先将实际代码包装到私有方法: public String getUldState(String uldNumber) throws SystemException { ProvideULDinformationRequest wsRequest = new ProvideULDinformationRequest(); wsRequest.setIdcode(

如果web服务提供的信息在一秒钟后没有响应,我想返回null。

一种方法是使用
CompletableFuture
执行超时

首先将实际代码包装到私有方法:

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;
}
然后从控制器调用它:

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;
}

可以添加
线程睡眠(1000)内部服务调用后重试?我想答案是正确的。此方法会导致当前执行的线程在指定的毫秒数内休眠。在我的例子中,不需要暂停它,但我想让它处理请求,但如果它在一秒钟后没有响应,我将返回null。感谢您的回答,它看起来是正确的,但问题是我在JAVA 7上,而“CompletableFuture”在JAVA 8上。显然它不接受这种语法“->getUldStatePrivate(uldNumber)”,它显示为错误(将项目编译器符合性设置设置设置为1.8,将项目JRE构建路径条目设置为“JavaSE-1.8”),但函数(“getUldStatePrivate”)在其中调用(“getUldState”)?
返回getUldStatePrivate(uldname)未来任务中的code>。
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
    }
}
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
    }
}