如何解决并行调用 list<Futures> 异步 webservice 客户端
我有一个 Web 服务客户端,它在不同的端点上使用相同的 wsdl 调用多个 Web 服务,因此我决定以并行方式进行异步调用。 我生成了 wsimport async jax-ws 客户端,并决定使用带有异步回调的 Future 调用(使用 single AsyncHandler 实例进行所有期货操作),
问题是:handleResponse(Response response) 方法中有没有办法知道响应被引用到期货列表中的哪个未来?任何可以在请求上下文中完成并传播到响应上下文的东西? 我确实应该在 AsyncHandler 中保留一个状态并为每个未来的操作创建一个新的 Handler 并将响应存储在共享列表中(可能是线程安全类成员)?
有没有办法像这里一样将请求上下文传播到响应? [https://docs.oracle.com/middleware/1213/wls/WSGET/jax-ws-async-roadmap.htm#BABFAFHD][1]
谢谢大家。我的片段:
WsSoapClient ws = new ....;
List<Future> futures = new ArrayList<>();
for (String url : urlList) {
BindingProvider bp = (BindingProvider) ws;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,url);
Future invokeAsync = ws.getAsync("foo",mh);
futures.add(invokeAsync);
}
futures.stream().parallel().forEach((t) -> {
try {
t.get(15L,TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
}
});
class MessageHandler implements AsyncHandler<String> {
private final List<String> responses;
public MessageHandler() {
List<String> rr = new ArrayList<>();
responses = Collections.synchronizedList(rr);
}
@Override
public void handleResponse(Response<String> response) {
try {
String get = response.get();
responses.add(get);
} catch (Exception e) {
e.printStackTrace();
}
}
public List<String> getResponses() {
return responses;
}
}
[1]: https://docs.oracle.com/middleware/1213/wls/WSGET/jax-ws-async-roadmap.htm#BABFAFHD
解决方法
我最终实现了一个维护状态的自定义回调处理程序。每个未来都有一个不同的实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。