应用程序如何处理异步响应 - 通过回调

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 密切相关:如果没有线程在其堆栈上具有 Futurehandler(及其 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

【讨论】:

以上是关于应用程序如何处理异步响应 - 通过回调的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何处理 BLE 响应并显示新值

如何处理 Alamofire 的异步特性 [重复]

Flux:如何处理多个异步请求

nodejs 异步应该如何处理

如何处理来自异步函数python的数据

如何处理异步 sendMessage 调用?