并行调用列表<Futures> 异步网络服务客户端
Parallel invoking list<Futures> async webservice client
我有一个 Web 服务客户端,它在不同的端点上使用相同的 wsdl 调用多个 Web 服务,所以我决定以并行方式进行异步调用。
我生成了 wsimport async jax-ws 客户端,我决定使用带有异步回调的 Future 调用(使用 single AsyncHandler 实例进行所有期货操作),
问题是:handleResponse(Response response) 方法中有没有办法知道响应被引用到未来列表中的哪个未来?任何可以在请求上下文中完成并传播到响应上下文的东西?
我真的应该在 AsyncHandler 中保留一个状态并为每个未来的操作实例化一个新的处理程序并将响应存储在共享列表中(可能是线程安全的 class 成员)?
有没有办法像这里一样将请求上下文传播到响应?
[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
我最终实现了一个维护状态的自定义回调处理程序。每个未来一个不同的实例。
我有一个 Web 服务客户端,它在不同的端点上使用相同的 wsdl 调用多个 Web 服务,所以我决定以并行方式进行异步调用。 我生成了 wsimport async jax-ws 客户端,我决定使用带有异步回调的 Future 调用(使用 single AsyncHandler 实例进行所有期货操作),
问题是:handleResponse(Response response) 方法中有没有办法知道响应被引用到未来列表中的哪个未来?任何可以在请求上下文中完成并传播到响应上下文的东西? 我真的应该在 AsyncHandler 中保留一个状态并为每个未来的操作实例化一个新的处理程序并将响应存储在共享列表中(可能是线程安全的 class 成员)?
有没有办法像这里一样将请求上下文传播到响应? [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
我最终实现了一个维护状态的自定义回调处理程序。每个未来一个不同的实例。