Java 和 Spring - 轮询 http 端点,直到服务器完成处理

Posted

技术标签:

【中文标题】Java 和 Spring - 轮询 http 端点,直到服务器完成处理【英文标题】:Java & Spring - polling the http endpoint until the server finishes processing 【发布时间】:2019-01-04 17:17:51 【问题描述】:

我正在努力寻找以恒定间隔(例如~1 秒)轮询服务器的正确方法。

流程如下

客户端应用程序收到消息,表明轮询可以从提供的参数开始(不需要时它不会轮询) 客户端应用程序开始每隔约 1 秒轮询一次 http 端点,参数随消息到达(如查询参数) 服务器应用程序以 pending 状态响应,表明客户端应继续轮询 服务器应用程序以 finished 状态响应并返回结果 - 无需继续轮询。

我们可以有多个线程,因为客户端应用程序可能会在短时间内收到多条消息 - 轮询应该立即开始

我不想重新发明***,也许有合适的工具可以与 java/spring 一起使用?

主要特点

仅在需要时进行轮询 使用自定义参数进行轮询(查询字符串中的自定义参数) 扩展轮询,因为应用程序可以以相同的时间间隔同时轮询多个端点

我正在浏览各种库,例如 Apache Camel 或 Spring Integration PollableChannel,但我觉得这些库都不能为我提供开箱即用的正确解决方案。

如果没有这样的库 - 我将使用 redis 和简单循环自己编写它,但也许有人遇到过类似的问题。

【问题讨论】:

您是否考虑过避免轮询并使用 WebSocket 提供一种回调机制? 恐怕服务器应用程序不支持 WebSocket 协议 【参考方案1】:

如果我正确理解您的架构,重点是从客户端应用程序调用相同的 HTTP 端点,直到获得预期结果。在这种情况下,我建议使用 RequestHandlerRetryAdvice 之类的东西,带有 AlwaysRetryPolicyFixedBackOffPolicy(默认为 1 秒)。

为了模拟异常,我建议使用带有propagateOnSuccessEvaluationFailures = true 选项的ExpressionEvaluatingRequestHandlerAdvice,以便在来自服务器的回复为pending 时从onSuccessExpression 重新抛出异常。

您需要向@ServiceActivator 申请HttpRequestExecutingMessageHandler

在参考手册中查看更多信息:https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#message-handler-advice-chain

【讨论】:

是的,架构的设计完全符合您的理解。它会同时支持多个轮询器吗?我的意思是,当我收到 id 为 1 的事件时,我需要轮询 service.com/result-1.xml,如果我收到 id 为 2 的事件,我需要同时独立轮询 service.com/result-2.xml , 直到双方都满意。谢谢! 没错。它们都将在自己的调用者线程中工作,因此可以同时请求不同的参数。只有提到的解决方案的问题是调用者将被阻止,直到正确的finished 响应。

以上是关于Java 和 Spring - 轮询 http 端点,直到服务器完成处理的主要内容,如果未能解决你的问题,请参考以下文章

求教,django与长轮询,该怎么解决

Spring mvc 4.0.5 长轮询示例

HTTP协议中的短轮询、长轮询、长连接和短连接

SpringBoot - WebSocket

soul 网关(十二):数据同步方式之 Http(一)

websocket