我已经做了几年的Java,但我没有太多的异步编程经验。
我正在开发一个应用程序,它对一些同步Web服务进行SOAP Web服务调用,目前我的使用应用程序的实现也是同步的,即。我的应用程序线程在等待响应时阻塞。
我正在尝试学习如何以异步方式处理这些SOAP调用 - 只是为了它本身但我有一些高级问题,我似乎无法找到任何答案。
我正在使用CXF,但我的问题并不是专门针对CXF或SOAP,而是我认为在异步应用程序架构方面更高级别。
A
)来调用远程Web服务callback
方法并返回Future
A
)完成了它的位,一旦返回Future
B
)被分配并调用callback
方法(通常使用我认为的结果填充Future
)Q1。我无法摆脱阻塞线程模型 - 如果线程(A)不再监听该网络套接字,那么从远程服务返回的响应如何获得分配线程(B) - 它是否被视为一个新的请求进入服务器/容器,然后分配一个线程来服务它?
Q2。与Q1密切相关我想:如果没有Thread在其堆栈上有Future
或handler
(及其callback
方法),那么远程Web服务的响应如何关联使用它需要调用的回调方法?
或者,在另一种询问方式中,Thread B
(现在处理响应)如何被赋予对Future
/ Callback
对象的引用?
非常抱歉我的问题太长了 - 感谢任何花时间阅读它的人! :)
答案 0 :(得分:0)
我不明白为什么你要使用异步线程添加所有这些复杂性。
设计异步soap服务的方法: 您有一个服务向给定的客户端/客户端发送响应。 这些客户端以异步方式处理响应。 完成后,他们会调用另一种肥皂方法来返回他们的回复。 响应将仅存储在队列(例如数据库表)中,而没有任何额外的逻辑。你有一个"工人"处理传入任务的服务。如果再次需要响应,则将调用另一个远程服务上的另一个方法。我将作为事件存储在数据库中的请求,稍后将由EventHandler异步处理。看到 六角形建筑: https://www.youtube.com/watch?v=fGaJHEgonKg
答案 1 :(得分:0)
你的Q1和Q2似乎与多线程有关,而不是与异步调用有关。
异步Web服务调用的神奇之处在于,您不必担心多线程在等待响应时处理阻塞。
从问题的具体问题陈述是什么(即,你希望你的应用程序在阻止或阻塞时做什么)有点不清楚,但是这里有几种方法可以使用异步Web服务调用这将允许你做其他工作。
对于以下情况,假设dispatch()方法调用Dispatch.invokeAsync(T msg, AsyncHandler handler)并返回Future:
1)发送多个Web服务请求,以便它们并行运行:
如果您有多个要使用的服务,并且它们都可以独立执行,请立即将它们全部分发,并在收到所有响应后处理它们。
ArrayList<Future<?>> futures = new ArrayList<Future<?>>();
futures.add(serviceToConsume1.dispatch());
futures.add(serviceToConsume2.dispatch());
futures.add(serviceToConsume3.dispatch());
// now wait until all services return
for(Future f<?> : futures) {
f.get();
}
// now use responses to continue processing
2)民意调查:
Future<?> f = serviceToConsume.dispatch();
while(!f.isDone()) {
// do other work here
}
// now use response to continue processing