如何让服务等待带外流程完成?

时间:2018-10-12 18:27:00

标签: java spring asynchronous java-8

我有一项服务,位于服务器1上。我们将其称为PDFServicePDFService提取文档并将它们缝合在一个PDF中。

但是,PDFService仅知道文档ID。它依靠Server 2来获取文档的实际内容。

PDFService处理开始时,它将分批收集文档ID。当有一个批处理时,它将针对该批处理中的每个ID的异步请求发送到服务器2上的队列(取回204)。然后它将继续收集更多批次并重复。

所有批次均已收集并寄出后,PDFService将开始缝合过程。

同时,服务器2可能没有处理任何文档,也没有将某些文档或所有文档返回给服务器1。服务器2可能以与接收文档不同的顺序返回文档。编译和返回的时间不同。)

服务器1必须按照发送它们的顺序缝合它们。因此,它必须等待文档1,缝合,等待文档2,缝合,等等。

到目前为止,我有一个DocumentManager类,它将所有文档ID保留在Map值中的null中。从服务器2返回完成的文档后,Map会更新为实际值(保存文档内容的对象)。显然这是错误的,因为那时PDFService必须使用while null + sleep,这很糟糕。

我的问题是:如果需要,如何让PDFService对每个文档“等待”?CompletableFuture对象添加到我的Map中似乎很有希望,但是我无法弄清楚如何使用它,或者那是否是正确的方法。

(这是我的第一个问题,请提供建设性反馈!)

1 个答案:

答案 0 :(得分:1)

H-m-m ... 我可以建议您查看一些企业集成框架,例如“ Spring集成”,“ Apache Camel”,“ MuleSoft”等。这样的框架可以处理所有等待,异步,并行,聚合等事务,对您来说将更加容易。

一般

  

它将为批次中的每个ID发送异步请求到服务器2上的队列

您已经提到一个队列,因此使用JMS队列是一种可能的解决方案。

  • Server1将Server2的documentId发送到JMS队列
  • Server2侦听队列并以实际文档进行响应 (服务器可以在JMS消息上进行回复的可能性有很多)
  • Server1侦听响应,然后在收到所有请求后将它们缝合在一起

但是使用EIP框架,JMS不仅是一种可能性-以批处理为例,它可以是同步的,但可以并行调用Server2 ...

BTW:在没有任何框架(EIP和/或JMS)的情况下从头开始构建这样的东西非常痛苦,并且没有这样做的感觉。