版本7中的框架Vaadin使用Atmosphere来启用推送逻辑,并且显然还启用了系统中的"所有"通信(当它可用时),也就是说,还启用了浏览器的正常请求。
当Atmosphere无法使用websocket时(例如,当Jetty没有配置支持websocket),因此必须依赖长轮询或类似的HTTP"假"推送方法,这似乎是一个很长的Servlet调用时,这一切都很好。
然而,当使用实际的WebSocket时,Shiro和Hibernate都会大声抱怨。
问题是Servlet过滤器不会"介入"WebSockets。Hibernate使用spring的OpenSessionInViewFilter创建每个请求的连接,它也通过在退出时提交/关闭它来充当事务边界。Shiro使用AbstractShiroFilter的扩展创建WebSubject对象,它甚至将Servlet请求和Servlet响应对象粘贴到主题中,并在退出时清除"ThreadContext"(它只是一个ThreadLocal)。
这里有人有什么好主意吗?我希望Atmosphere有类似"try finally"的"filterChain.continue"逻辑,这样就可以重新创建上面描述的进入/退出逻辑。然而,正如我目前所看到的,Atmosphere没有这种过滤功能。
我很乐意听取建议。
也许您可以尝试用Atmosfere的拦截器替换servlet API过滤器?我想它们对你来说是有用的。
可能已经解决了这个问题,但我想我应该加入进来。使用Vaadin、Spring、Hibernate堆栈遇到了同样的问题。
将其添加到您的UI中以关闭WebSockets,它将通过其他过滤器。@Push(value=PushMode.MANUAL,transport=transport.STREAMING)
现在我遇到了一个问题,会议被取消了。