【问题标题】:Timeout on java web services clientsjava web 服务客户端超时
【发布时间】:2012-10-30 03:30:22
【问题描述】:

我们的工作团队选择使用 NetBeans 7.1.2 提供的所有工具来开发 Web 服务。

很遗憾,我们的网络服务太不稳定而且经常离线。这是我们现在无法解决的问题。我们的决定是在我们的客户中实施超时。但是我们没有找到任何关于它的选项或文档。

有没有办法让客户端在服务需要(例如 5 秒)返回答案时抛出异常?所以我们无法捕捉到这个异常并处理视图的流程。

我问是因为有办法用线程和时间计数器来实现它,但很明显其他程序员已经遇到了同样的问题。

顺便说一下,我们正在使用 JAX-WS。

非常感谢。

【问题讨论】:

  • 你是说如果用户等待5秒,你的服务负载很重,所以你想返回503错误?
  • 没有。实际上,我们的托管 bean 使用 Web 服务客户端来更新一些面板。但是这些面板不能干扰页面流。因此,如果 Web 服务返回答案的时间超过 5 秒,我想将面板“rendered”属性设置为 false。

标签: java web-services jax-ws


【解决方案1】:

使用 java.util.concurrent 包类。比如你可以执行带有超时的Future实例:future.get(5, TimeUnit.SECONDS),如果它异常有TimeoutException,你可以随心所欲地做出反应:

Future<String> future = executor.submit(new Callable<String>() {
    public String call() {
        return webService.executeServiceMethod();
    }
});
try {
    String result = future.get(5, TimeUnit.SECONDS);
    processResult(result);
} catch (TimeoutException ex) {
    displayMessageToUserOrExecuteAgain();
}

【讨论】:

  • 这可能行得通,但调用将继续运行、消耗资源等。您的调用可能会超时,但底层工件不会。
  • @hoaz,它奏效了,我正处于结束问题的一步。但只有一件事让我担心。应用服务器上的内存泄漏是否危险?我之所以问,是因为我害怕使用非托管线程,并且使用 Future 如果抛出 TimeoutException,我无法杀死线程,对吧?
  • future#cancel 可以正常工作,实际上还有其他方法可以释放资源,例如关闭执行器本身,因此您可以尝试一下
  • @Adriano 'Stanley':另请参阅 stackoverflow.com/questions/2148915/…。这似乎以更优雅的方式解决了您的问题。
  • 您好,需要帮助,我已经为注入的客户端配置了连接超时,但默认时间超过 1 分钟。谁能给点建议?
【解决方案2】:
猜你喜欢
  • 2013-08-01
  • 2014-09-04
  • 2012-11-24
  • 1970-01-01
  • 2010-11-09
  • 2010-09-17
  • 2014-01-18
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多