应用程序如何处理异步响应 - 通过回调
Posted
技术标签:
【中文标题】应用程序如何处理异步响应 - 通过回调【英文标题】:How Do Applications handle Asynchronous Responses - via Callback 【发布时间】:2015-06-20 12:07:11 【问题描述】:我已经做 Java 几年了,但我对异步编程没有太多经验。
我正在开发一个应用程序,它使 SOAP Web 服务调用一些同步 Web 服务,目前我的 消费 应用程序的实现也是同步的,即。我的应用程序线程在等待响应时阻塞。
我正在尝试学习如何以异步方式处理这些 SOAP 调用 - 只是为了它,但我有一些我似乎无法找到任何答案的高级问题。
我正在使用 CXF,但我的问题不是专门针对 CXF 或 SOAP,而是更高级别,我认为是异步应用程序架构。
我想知道的(通过一个场景工作)——在高层次上——是:
-
所以我有一个线程 (
A
) 在我的 JVM 中运行,它调用远程 Web 服务
它注册一个callback
方法并返回一个Future
线程 (A
) 已经完成了它的工作,一旦它返回了Future
,它就会返回到它的池中
远程 Web 服务响应返回,线程 (B
) 被分配并调用 callback
方法(我相信它通常会填充 Future
的结果)
第一季度。我无法摆脱阻塞线程模型-如果线程(A)不再侦听该网络套接字,那么从远程服务返回的响应如何分配线程(B)-它是否只是被视为一个新的请求进入服务器/容器,然后分配一个线程来服务它?
第二季度。我想与 Q1 密切相关:如果没有线程在其堆栈上具有 Future
或 handler
(及其 callback
方法),那么来自远程 Web 服务的响应如何与它需要的回调方法相关联打电话?
或者,换一种问法,线程B
(现在处理响应)如何获得对Future
/Callback
对象的引用?
非常抱歉,我的问题太长了 - 感谢所有抽出时间阅读它的人! :)
【问题讨论】:
您是想了解应用程序的当前行为,还是计划重新设计应用程序以使其以异步方式运行? 【参考方案1】:您的 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
【讨论】:
【参考方案2】:我不明白你为什么要使用异步线程来增加所有这些复杂性。
异步soap服务的设计方式: 您有一项服务向给定的客户端/客户端发送响应。 这些客户端处理异步给出的响应。 完成后,他们会调用另一个soap方法来返回他们的响应。 响应将仅存储在队列中(例如数据库表),没有任何额外的逻辑。您将有一个“工人”服务处理传入的任务。如果再次需要响应,则将调用另一个远程服务上的另一个方法。我会将请求作为事件存储在数据库中,稍后将由 EventHandler 异步处理。看 六边形架构: https://www.youtube.com/watch?v=fGaJHEgonKg
【讨论】:
以上是关于应用程序如何处理异步响应 - 通过回调的主要内容,如果未能解决你的问题,请参考以下文章