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
之类的东西,带有 AlwaysRetryPolicy
和 FixedBackOffPolicy
(默认为 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 端点,直到服务器完成处理的主要内容,如果未能解决你的问题,请参考以下文章