将 JaxRS REST 服务与 WebSocket 集成

Posted

技术标签:

【中文标题】将 JaxRS REST 服务与 WebSocket 集成【英文标题】:Integrating JaxRS REST service with WebSockets 【发布时间】:2015-04-21 23:54:56 【问题描述】:

我正在尝试开发一个实现发布者订阅模式的社交网络(有点像 Twitter 所做的):用户可以关注人们,因此当他们的关注者的新出版物被发送时会收到通知。

我现在只有一个用 JaxRS 实现的工作 REST 服务,运行在 Tomcat 7 上,提供登录、注册、获取配置文件数据和提交帖子的服务。 Servlet Mapping 是通过 web.xml 完成的

My JaxRS app config

RestServices

Web.xml

但应用程序的权重来自发布订阅部分。这就是事情变得混乱的地方。

在谈到技术和实现之前,这个 pubsub 的生命周期:

让 A 和 B 成为应用程序的一些用户,A 跟随(订阅)B。

    A 导航到他的“时间线”,因此在服务器中注册了一个 WebSocket 端点,当他订阅的任何人发布任何内容时,他将从该端点接收通知。 (A,他自己会成为话题吗?) B 发布一个新帖子,它通过 HTTP POST /post 发送到 JaxRS 服务。 服务器将发布存储在数据库中,然后通过 WebSocket 将其发送给监听订阅者。由于 A 处于活动状态并正在侦听,因此通过他的 WebSocket/topic 发送发布。 A 收到有关新出版物的通知。

我曾使用过 Java 内置 WebSockets (javax.websocket)、Spring websockets(通过 STOMP)和内置的 javascript 和 SockJS。我知道 JaxRS 有一些称为服务器发送事件的东西,它的作用类似于 websocket,但我完全不知道如何初始化和使用它们。

我的疑惑:

1) 我可以将 Spring Websockets 与我的 JaxRS 服务器“混合”吗?如何初始化?

2) 使用 JaxRS 和 SSE,我可以在服务器上动态创建 WS 端点吗?

提前致谢

【问题讨论】:

不是完整的答案,但您可能需要顶一下 Atmosphere,它支持 1) 和 2) github.com/Atmosphere/atmosphere。看看goo.gl/s7OwGc 哦,很好,去试试,如果我能解决它会回复,谢谢! 【参考方案1】:

最后使用 Jersey 的服务器发送事件做了一个解决方法,虽然 IE 不支持,但可以满足我的需要

这是SSEProvider 和SSEDispatcher 的代码

Gradle dependency

还有前端connection和handlers

还有一些关于html5 SSE的文档

【讨论】:

值得一提的是,IE 支持使用 polyfill,例如here 或 here

以上是关于将 JaxRS REST 服务与 WebSocket 集成的主要内容,如果未能解决你的问题,请参考以下文章

CORS 策略已阻止从源“http://localhost:3000”访问“http://localhost:9900/jaxrs-post-example/rest/customers”获取

jersey 2.0 jaxrs RI - 在异常时返回 json 字符串

Java REST 分块编码

RESTEasy 与 Apache Ant

什么是Netflix Feign?它的优点是什么?

无法使用 Wildfly Web 服务器运行 JaxRs Web 服务