我的系统由一个门户网站(基于Spring)和一个远程后端(基于J2EE)组成,后者公开 API 以提供服务。 用户应该能够从 Web 门户开始在云上部署某个 PaaS 服务(此过程由后端管理)并实时查看部署状态。
注意:上述部署只是一个复杂的操作。
为了按照上述方式部署服务,我在后端定义了一个长时间运行的事务,它包括两部分:同步和异步 .
第一个公开了一个RESTful WebService,用于启动部署过程。它返回已启动交易的唯一 ID。
String lrtId = myRESTClient.startDeploy(someInfo);
另一部分对于检查进度状态很有用:它必须返回总结部署状态的信息(例如,进行中、完成、已停止、完成百分比、时间戳等)。
为了实时获取这些信息,我想到了两种解决方案:
- 将第二部分公开为另一个 WebService 并通过以下方式调用它 投票;
- 通过 WebSocket 公开它(并使用其他工具,例如 STOMP)。
请注意,出于安全原因,后端端点必须是私有(private)的,因此用户不能直接调用异步部分(通过脚本):只有 webapp 必须能够与后端通信。 为了克服这个限制,我想通过 Spring Web 定义一个专用的网络资源:它的 Controller 应该隐藏门户和后端之间的通信,检索实时数据并将其提供给另一个网络资源(在本例中为网页)。
下图总结了这个场景:
作为这个用例的新手,我想知道有关所提议解决方案的一些建议。
它们是否足够?哪个更好?为了实现它们,需要了解哪些重要信息?有什么问题吗?
最佳答案
恕我直言,轮询会消耗比必要更多的资源(轮询),最好使用 Websocket。
我个人以 JMS 方式使用 websocket:发送 JMS MDB(消息驱动的 bean)(例如,在多次调用我的任何 DAO 时),然后由代理转换(它至少工作在 AMQ 上)在 STOMP over WebSocket Client 中(并使客户端与技术 WebSvc 和 WebSocket 队列 ID 对应)。
基于 WebSocket 的 STOMP 也具有事务性的优势,因此您可以知道当您收到所有 ACK 并且没有获得回滚时计算结束:它在某些情况下避免了更多的 WebService 调用。
关于java - SOA环境下webapp的实时数据管理(远程后端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529833/