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

时间:2015-04-14 18:29:03

标签: java multithreading web-services asynchronous callback

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

我正在开发一个应用程序,它对一些同步Web服务进行SOAP Web服务调用,目前我的使用应用程序的实现也是同步的,即。我的应用程序线程在等待响应时阻塞。

我正在尝试学习如何以异步方式处理这些SOAP调用 - 只是为了它本身但我有一些高级问题,我似乎无法找到任何答案。

我正在使用CXF,但我的问题并不是专门针对CXF或SOAP,而是我认为在异步应用程序架构方面更高级别。

我想知道的事情(通过一个场景工作) - 在高层次 - 是:

  1. 所以我在我的JVM中运行一个线程(A)来调用远程Web服务
  2. 注册 callback方法并返回Future
  3. 线程(A)完成了它的位,一旦返回Future
  4. 就返回到它的池中
  5. 远程Web服务响应返回并且线程(B)被分配并调用callback方法(通常使用我认为的结果填充Future
  6. Q1。我无法摆脱阻塞线程模型 - 如果线程(A)不再监听该网络套接字,那么从远程服务返回的响应如何获得分配线程(B) - 它是否被视为一个新的请求进入服务器/容器,然后分配一个线程来服务它?

    Q2。与Q1密切相关我想:如果没有Thread在其堆栈上有Futurehandler(及其callback方法),那么远程Web服务的响应如何关联使用它需要调用的回调方法?

    或者,在另一种询问方式中,Thread B(现在处理响应)如何被赋予对Future / Callback对象的引用?


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

2 个答案:

答案 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