【问题标题】:timeout if the webservice does not respond in 1 second, then return null如果 web 服务在 1 秒内没有响应超时,则返回 null
【发布时间】:2018-11-07 04:54:21
【问题描述】:
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;
}

如果网络服务 provideULDinformation 在一秒钟后没有响应,我想返回 null。

【问题讨论】:

  • 也许在try里面的服务调用之后添加Thread.sleep(1000);
  • 我猜答案是对的here
  • 此方法使当前执行的线程休眠指定的毫秒数。在我的情况下,不需要暂停它,但我想让它处理请求,但如果它在一秒钟后没有响应,我返回 null。

标签: java multithreading web-services jakarta-ee timeout


【解决方案1】:

一种方法是使用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 中,您可以使用普通的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
    }
}

【讨论】:

  • 感谢您的回答,看起来不错,但问题是我在 JAVA 7 上,而“CompletableFuture”在 JAVA 8 上..
  • 显然它不接受这种语法“-> getUldStatePrivate(uldNumber)”,它显示为错误(将项目编译器合规性设置设置为 1.8 将项目 JRE 构建路径条目设置为“JavaSE-1.8”)
  • 但是函数 ("getUldStatePrivate") 在 ("getUldState") 的什么地方被调用?
  • return getUldStatePrivate(uldNumber);FutureTask
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多