【问题标题】:How to deliver the result of asynchronous request from back to front (Callback)如何将异步请求的结果从后台传递到前台(Callback)
【发布时间】:2023-01-13 19:16:08
【问题描述】:

客户端向我的服务“A”发送请求,然后我从服务“A”向 Camunda 发送请求,如“doSmthAndGet”,然后 camunda 回复“请求已接受”并异步调用另一个服务“B”来处理我的请求。服务 B 返回结果后,Camunda 将调用我的服务“A”的 API 返回给我这个响应。我可以通过哪些方式将此结果传递到网页(JS)以显示给客户端?我想到了一个 websocket,但我不确定这是否是个好主意,因为对于一个客户端来说,这样的请求发送一次,之后就不再需要 websocket 了。但是当我在我的服务“A”中获得特定客户端的处理结果时,我需要某种“通道”来调用前端(JS)。

【问题讨论】:

  • 是什么触发了服务“A”的请求?通常,您会从客户端向服务器发送一个 http 请求,然后返回某种响应。您描述的调用位置和 API 然后 API 调用您的 API 的流程听起来有点奇怪,您确定这是正在发生的事情吗?
  • 首先客户端触发请求。是的,因为 Camunda 立即返回响应“请求已接受”,而无需等待服务“B”处理此请求

标签: javascript java spring websocket callback


【解决方案1】:

我想我现在理解你的困境,而不是:

  1. 客户端 <--> 服务器 A <--> Camunda <--> 服务器 B-->客户端上服务器 B 的结果

    你有这样的东西:

    1. 客户端 <--> 服务器 A <--> Camunda-->客户端上的 camunda 结果“OK”
    2. Camunda <--> 服务器 B-->来自 Camunda 上服务器 B 的结果
    3. Camunda <--> 服务器 A-->服务器 A 上服务器 B 的结果

      (我现在指的是服务,但为了便于解释,我更愿意指的是机器)

      什么时候服务器 X提出要求服务器 Y然后服务器 X技术上是一个客户就该请求而言。 Camunda 和您的服务器之间的通信实际上只能以这种方式进行,因为客户端(服务器 A)也是服务器。

      如果您想向客户端发送数据,您必须从该客户端发出请求或首先建立双向连接,例如像你建议的 websocket。

      解决方案

      您可以声明一个变量,然后简单地推迟对初始请求的响应,直到“第 3 步”用某个值填充它,但我担心这种方法容易出现各种错误并且不可持续。

      您仍然可以使用类似这种方法的方法,但不是推迟您依赖客户端“稍后再回来”的初始请求。您可以使用 JS 定期自动执行的操作。

      这两种情况的挑战是您必须实施或至少考虑某种用户会话确保您将正确的数据发送回正确的用户的逻辑。出于这个原因,我认为您自己使用 WebSockets 的建议可能是最优雅的。

      我不认为只使用 WebSocket 一次是个问题,如果你愿意,你可以在整个过程完成后关闭连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多