带回调的外部API异步调用

时间:2017-07-06 19:42:18

标签: java spring angular

我使用Angular和Spring进行内部API通信。现在我需要调用外部api来获取一些数据。那个外部API提供了回调功能,所以我从Angular触发调用,调用Spring rest方法,最后调用外部API。 另一方面,我得到了我的回调方法的数据(也是Spring rest),但我不知道如何将这些数据传回Angular。

websocket是唯一的选择吗?

1 个答案:

答案 0 :(得分:0)

如果内部API调用超过允许的客户端超时,则您将需要找到类似WebSocket或WebSocket的替代。 WebSockets的替代方法是使用long-polling(源代码here的好例子),这实际上是客户端重复发出请求,直到原始任务完成并且可以发送数据。无论哪种方式,您都需要使用某种pub/sub机制来处理多个用户,这是事情变得复杂的地方。

发布/订阅可能很复杂,我手边没有示例,但基本上你必须(1)让客户端使用唯一标识符订阅频道(你可以做这与CometD通过服务渠道),(2)评估响应,(3)将响应发布到客户的订阅频道,最后(4)关闭频道,当它不再使用时。

我很幸运CometD作为一个库来简化发布/子频道管理,它提供了一个good abstraction for asynchronous communication,虽然我没有尝试使用Spring,但它可能对你想要的东西很重要做。

我不太熟悉的另一个选择是使用Spring with STOMP。这似乎来了recommended by others。 Spring确实提供了使用STOMP向单个用户发送消息的方法:Sending message to specific user on Spring Websocket

我建议按照上面的STOMP示例。

其他STOMP资源:

作为旁注,这里也可能需要限制,就像你可以从客户端产生长时间运行的线程一样。

如果您选择不使用STOMP或CometD,那么使用Spring的DeferredResult(如Roger Hughes example中)绑定订阅时,更轻松的解决方案就是为这个案例滚动您自己的pub / sub通过UUID令牌请求长轮询请求,如果您选择禁止每个用户的并发请求,则该令牌也可能是会话ID。在订阅时,系统可以将请求与UUID相关联,并将此UUID返回给客户端。然后,客户端可以进行长轮询请求(同样,如Roger Hughes example中),但附加了UUID。服务器可以等到给定UUID的请求完成,然后通过客户端的活动长轮询请求将结果返回给客户端。

频道管理(即请求/ UUID跟踪)可以通过清除DeferredResult结果检索中的频道并使用单独的线程作为GC删除孤立频道来完成 - 或者更好的是,自动如果没有活动侦听器,则在DeferredResult完成/超时时删除孤立通道。如果您选择后一个选项,您将需要确保客户端在其长轮询请求之间不会有任何延迟,以便DeferredResult无意中完成而没有侦听器。