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

4

我已经做了几年的Java,但是对于异步编程并没有太多的经验。

我正在开发一个应用程序,该应用程序调用一些同步Web服务的SOAP Web服务调用,并且当前我的消费应用程序的实现也是同步的,即我的应用程序线程在等待响应时会被阻塞。

我试图学习如何以异步方式处理这些SOAP调用 - 只是为了好玩,但我有一些高级问题,似乎找不到任何答案。

我正在使用CXF,但我的问题不是特定于CXF或SOAP,而是更高层次的,从异步应用程序架构的角度来看。

我想知道(通过场景进行工作)- 高层次地 - 是:

  1. 所以我有一个线程(A)在我的JVM中运行,它调用远程Web服务
  2. 注册一个回调方法并返回一个Future
  3. 线程(A)完成了它的工作,并在返回Future后返回到它的池中
  4. 远程Web服务响应返回并分配线程(B),调用回调方法(通常使用结果填充Future

Q1. 我无法摆脱阻塞线程模型 - 如果线程(A)不再侦听该网络套接字,那么来自远程服务的响应如何分配给线程(B) - 它是否被视为服务器/容器中的新请求,然后分配一个线程来处理它?

Q2. 我想象中与Q1密切相关:如果没有线程拥有Futurehandler(带有其回调方法),那么来自远程Web服务的响应如何与其需要调用的回调方法关联起来?

或者,换句话说,线程B(现在正在处理响应)如何获得对Future / Callback对象的引用?


非常抱歉我的问题如此之长 - 感谢任何花时间阅读它的人! :)


你是想要了解你的应用程序当前的行为,还是计划重新设计你的应用程序以异步方式运行? - Arnab Biswas
2个回答

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

0

我不明白为什么要使用异步线程来增加所有这些复杂性。

设计异步SOAP服务的方法: 您有一个服务向给定的客户端/客户端发送响应。 这些客户端异步地处理给定的响应。 完成后,他们将调用另一个SOAP方法返回其响应。 响应将只存储在队列中(例如数据库表)中,没有任何额外的逻辑。您将有一个“工作人员”服务处理传入的任务。如果需要再次响应,则会调用其他远程服务上的另一种方法。我将在数据库中将请求存储为事件,稍后由EventHandler异步处理。请参见六边形架构: https://www.youtube.com/watch?v=fGaJHEgonKg


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接