Spring 集成 - 如何轮询外部服务直到条件为真?

Spring Integration - how do you poll an external service until condition is true?

我有以下场景:

我将数据发送给第三方(碰巧是 SOAP 服务)。外部服务接受我的数据,并给我一个唯一的参考,然后我可以使用它来调用第二个 SOAP 服务以查看我的数据是否已被处理。

所以我需要轮询第二个服务,直到我从它那里得到回复说我的数据已准备就绪。一旦准备就绪,我的流程就可以结束(我只想将它已准备就绪的事实写入数据库 table)。如果我轮询了一定次数但还没有准备好,我想放弃并调用某种异常处理。

我不知道应该用什么来投票;即检查我的 soap 调用结果并在一定时间后再次轮询的逻辑。我必须等待的时间可能是动态的——例如,调用的第 3 方服务可能会说“它还没有准备好,请在 5 分钟后重试”,这样我就必须在 5 分钟后再次轮询。

有谁知道我将如何使用 Java(或最好)Kotlin DSL 在 Spring 集成中执行上述操作?

我只是想弄清楚 Spring 集成是否适合这里的工作。

在你的情况下,我想说的“投票”更像是“重复直到中间有延迟”。

因此,在调用第一个服务后,您将转到第二个服务的频道。 然后你使用 route() 来确定它是否可以,或者必须重复。此时您发送到 delay(),此时它的持续时间确实可以从 SOAP 回复中确定。在这一点上我也会增加一些 attempts headers 来检查另一个 route() 看看我们是否可以重复或者已经到了抛出异常的时候了。

只是不要忘记,您可以在流的中间有一个 channel(),这样一些其他端点(如路由器或延迟器)可以直接将消息发送到此通道。

另一个解决方案可以用简单的 Java 来完成,它会围绕调用 @MessagingGateway 执行所有这些“重复直到”逻辑,后者会向第二个 SOAP 服务发送消息并等待其回复.

在文档中查看有关所有提到的组件的更多信息:

https://docs.spring.io/spring-integration/docs/current/reference/html/message-routing.html#router

https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#delayer

https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway

https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-dsl-channels