Java 带回调的外部API异步调用

Java 带回调的外部API异步调用,java,spring,angular,Java,Spring,Angular,我使用Angular和Spring进行内部API通信。现在我需要调用外部api来获取一些数据。那个外部API提供了回调功能,所以我从Angular触发调用,调用SpringREST方法,最后调用外部API。 另一方面,我从回调方法(也包括SpringREST)中获取数据,但我不知道如何将这些数据传输回Angular websocket是唯一的选择吗 如果内部API调用长于允许的客户端超时,则需要找到WebSocket或类似WebSocket的替代方法。WebSocket的替代方法是使用(源代码的

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


websocket是唯一的选择吗

如果内部API调用长于允许的客户端超时,则需要找到WebSocket或类似WebSocket的替代方法。WebSocket的替代方法是使用(源代码的好例子),它本质上是让客户机重复发出请求,直到原始任务完成并可以发送数据。无论哪种方式,您都需要使用某种机制来处理多个用户,这就是事情可能变得复杂的地方

发布/订阅可能很复杂,我手头上没有一个示例,但基本上您必须(1)让客户端使用唯一标识符订阅频道(您可以通过服务频道使用CometD进行此操作),(2)评估响应,(3)将响应发布到客户端订阅的频道,最后(4)当频道不再使用时,请将其关闭

我有幸将Comet作为一个库来简化发布/子频道管理,它提供了一个新的功能,尽管我还没有在Spring中尝试过,它可能对您想要做的事情很重要

我不太熟悉的另一个选择是使用。这似乎要来了。Spring确实提供了使用STOMP向单个用户发送消息的方法:

我建议遵循上面的跺脚例子

其他STOMP资源:

作为补充说明,这里可能也需要节流,因为任何时候都可以从客户端生成长时间运行的线程


如果您选择不使用STOMP或Comed,那么一个更轻松的解决方案可能是使用Spring(如中所示)为这种情况推出您自己的发布/订阅,通过令牌将订阅请求绑定到长轮询请求,如果您选择不允许每个用户并发请求,令牌也可能是会话ID。订阅时,系统可以将请求与UUID关联,并将该UUID返回给客户端。然后,客户端可以发出长轮询请求(同样,如中所示),但要附加UUID。服务器可以等待,直到对给定UUID的请求完成,然后通过客户端的活动长轮询请求将结果返回给客户端


通道管理(即,请求/UUID跟踪)可以通过在
DeferredResult
结果检索上清除通道,并使用单独的线程作为GC删除孤立通道来完成——或者,也许更好,如果不存在活动侦听器,则通过在
DeferredResult
completion/timeout上删除孤立通道来自动清除它们。如果您选择后一个选项,您将希望确保客户端在其长轮询请求之间不会有任何延迟,以便
DeferredResult
不会在没有侦听器的情况下意外完成。

在外部API响应之前,您能保持客户端和webapp之间的连接打开吗?打开WebSocket连接对于单个请求来说有点费力。执行此操作的典型方法是,在服务器从外部API检索信息之前,不让服务器响应。如果外部API使用回调函数,您可能会考虑让线程等待直到执行回调,尽管这可能取决于您预期的服务器负载。应用程序部署在HeloCu上,所以我没有选择来保持连接,因为来自外部API的响应通常大于30秒,而Heroku中的请求超时为30秒。