我有一项服务,位于服务器1上。我们将其称为PDFService
。 PDFService
提取文档并将它们缝合在一个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
中似乎很有希望,但是我无法弄清楚如何使用它,或者那是否是正确的方法。
(这是我的第一个问题,请提供建设性反馈!)
答案 0 :(得分:1)
H-m-m ... 我可以建议您查看一些企业集成框架,例如“ Spring集成”,“ Apache Camel”,“ MuleSoft”等。这样的框架可以处理所有等待,异步,并行,聚合等事务,对您来说将更加容易。
一般
它将为批次中的每个ID发送异步请求到服务器2上的队列
您已经提到一个队列,因此使用JMS队列是一种可能的解决方案。
但是使用EIP框架,JMS不仅是一种可能性-以批处理为例,它可以是同步的,但可以并行调用Server2 ...
BTW:在没有任何框架(EIP和/或JMS)的情况下从头开始构建这样的东西非常痛苦,并且没有这样做的感觉。