在 Spring Integration 中后台轮询 Http 请求状态

问题描述 投票:0回答:1

我正在尝试构建一个基于 Spring 集成的架构,其中我的系统需要通过各种协议与不同的其他系统进行通信。其中一个系统基于为长时间运行的作业公开 REST 端点。 我想要一个 Spring Integration HTTP 出站组件,它将提交作业(例如在

POST /api/job/submit
上使用
requestId
),然后从不同的端点轮询作业结果(例如
GET /api/job/{request-id}/result
)。

[注意:该作业将长时间运行,结果可能不会立即可用]

我试图公开此功能,从提交作业到使用单个函数获取结果,该函数将返回包含作业结果的

Future

这就是我的想法:

public Future<JobResult> executeJob(JobInput input) {
    // call the job submission endpoint using Http Outbound component or RestTemplate
    // get the result of this submission and confirm it is Http 200 
    // using the request id, kick off the task of checking the job result to an executor service. (instance of JobChecker)
    // return the future from the submitted callable.

}

class JobChecker implements Callable<JobResult> { 
      @Override
      public JobResult call() throws Exception {
        while(true) {
           // using rest template or another HTTP outbound channel check if the result of requestId is available 
        }
      }
}

我应该使用 Spring Integration 的哪些组件/组件组合来实现此目的?在将其强化为生产级解决方案方面,我是否遗漏了一些东西,即?满足错误处理、路由、保证交付和操作幂等性?

spring spring-integration enterprise-integration
1个回答
0
投票

不清楚你在做什么

executeJob()
。 Spring Integration 确实有很多功能可以帮助您。您可能真的可以将它们结合起来来实现要求。然而,为了选择最适合您的一个,我们需要了解有关您的逻辑流程的更多详细信息。

您可以在发送状态检查请求的 HTTP 出站网关上使用

RequestHandlerRetryAdvice
。如果失败并出现一些异常,例如
JobResultNotReadyException
或其他一些错误的 HTTP 状态。您可能需要将其与
ExpressionEvaluatingRequestHandlerAdvice
结合使用,以针对某些特定的 OK HTTP 回复抛出自定义异常,但该异常指示作业尚未完成。然而,这个解决方案将在同一个发送线程中工作。

如果您希望利用异步解决方案,您可能需要查看

ExecutorChannel
作为带有该检查状态网关的流程的输入。那么该网关的下一个端点确实是一个检查响应状态的路由器。如果这不行,您可以使用延迟器为下一次尝试提供一些退避。然后,您将原始消息发送回该
ExecutorChannel
以形成循环。该流程的入口点可以是带有
@MessagingGateway
网关方法返回的
Future
。当您收到成功响应时,您只需路由到桥接器,该桥接器将使用
replyChannel
标头来实现该
Future

如果我更多地了解您的要求和期望,我可能可以给您更多建议。

© www.soinside.com 2019 - 2024. All rights reserved.