gpt4 book ai didi

java - 如何在未来取消时在 Callable 中终止 CXF 网络服务调用

转载 作者:行者123 更新时间:2023-12-04 07:05:58 24 4
gpt4 key购买 nike

编辑

这个问题现在已经经历了几次迭代,所以请随意浏览修订版以查看有关历史和尝试过的事情的一些背景信息。

我将 CompletionService 与 ExecutorService 和 Callable 一起使用,通过 CXF 生成的代码同时调用几个不同 Web 服务上的多个函数。这些服务都为我正在使用的一组信息贡献不同的信息我的项目。然而,这些服务可能会在很长一段时间内无法响应而不会引发异常,从而延长对组合信息集的等待。

为了解决这个问题,我同时运行所有服务调用,几分钟后想终止任何尚未完成的调用,最好从可调用对象中或通过抛出记录哪些尚未完成的调用详细的异常。

这是一些高度简化的代码来说明我已经在做什么:

private Callable<List<Feature>> getXXXFeatures(final WiwsPortType port, 
final String accessionCode) {
return new Callable<List<Feature>>() {
@Override
public List<Feature> call() throws Exception {
List<Feature> features = new ArrayList<Feature>();
//getXXXFeatures are methods of the WS Proxy
//that can take anywhere from second to never to return
for (RawFeature raw : port.getXXXFeatures(accessionCode)) {
Feature ft = convertFeature(raw);
features.add(ft);
}
if (Thread.currentThread().isInterrupted())
log.error("XXX was interrupted");
return features;
}
};
}

以及同时启动 WS 调用的代码:
WiwsPortType port = new Wiws().getWiws();
List<Future<List<Feature>>> ftList = new ArrayList<Future<List<Feature>>>();
//Counting wrapper around CompletionService,
//so I could implement ccs.hasRemaining()
CountingCompletionService<List<Feature>> ccs =
new CountingCompletionService<List<Feature>>(threadpool);
ftList.add(ccs.submit(getXXXFeatures(port, accessionCode)));
ftList.add(ccs.submit(getYYYFeatures(port accessionCode)));
ftList.add(ccs.submit(getZZZFeatures(port, accessionCode)));

List<Feature> allFeatures = new ArrayList<Feature>();
while (ccs.hasRemaining()) {
//Low for testing, eventually a little more lenient
Future<List<Feature>> polled = ccs.poll(5, TimeUnit.SECONDS);
if (polled != null)
allFeatures.addAll(polled.get());
else {
//Still jobs remaining, but unresponsive: Cancel them all
int jobsCanceled = 0;
for (Future<List<Feature>> job : ftList)
if (job.cancel(true))
jobsCanceled++;
log.error("Canceled {} feature jobs because they took too long",
jobsCanceled);
break;
}
}

我在这段代码中遇到的问题是,在等待 port.getXXXFeatures(...) 返回时,Callables 实际上并没有被取消,而是以某种方式继续运行。正如您从 if (Thread.currentThread().isInterrupted()) log.error("XXX was interrupted"); 中看到的语句在 port.getFeatures 返回后设置中断标志,这仅在 Webservice 调用正常完成后可用,而不是在我调用 Cancel 时被中断。

谁能告诉我我做错了什么,以及如何在给定时间段后停止正在运行的 CXF Web 服务调用,并在我的应用程序中注册此信息?

最好的问候,蒂姆

最佳答案

编辑 3 新答案。

我看到这些选项:

  • 将您的问题作为功能请求发布到 Apache CXF
  • 自己修复 ACXF 并公开一些功能。
  • 在 Apache CXF 中寻找异步 WS 调用支持的选项
  • 考虑切换到不同的 WS 提供程序(JAX-WS?)
  • 如果服务支持,您的 WS 是否使用 RESTful API 调用自己(例如,带有参数的纯 HTTP 请求)
  • 仅适用于 super 专家:使用真正的线程/线程组并使用非正统方法杀死线程。
  • 关于java - 如何在未来取消时在 Callable 中终止 CXF 网络服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120783/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com