Servlets Weblogic 12.2.1.2-websocket端点-此请求禁用异步支持

Servlets Weblogic 12.2.1.2-websocket端点-此请求禁用异步支持,servlets,asynchronous,websocket,weblogic,tyrus,Servlets,Asynchronous,Websocket,Weblogic,Tyrus,对于我将要提出的问题,我已经有了答案 在任何情况下,我在这里问它,以便它可以帮助人们从JEE 6迁移到JEE 7,并考虑使用websocket-例如用websocket功能代替长轮询 问题: 在支持JEE 7的Weblogic 12.2.1.2中,尝试使用以下指南设置WebSocket: 注意:上面的指南非常简单,它所说的都是正确的,“应该”起作用。将不一定在您的应用程序中工作,因为它不在我的应用程序中。但从概念上讲,它应该 尽管如此。 websocket应用程序在从浏览器到后台的握手过程中出

对于我将要提出的问题,我已经有了答案

在任何情况下,我在这里问它,以便它可以帮助人们从JEE 6迁移到JEE 7,并考虑使用websocket-例如用websocket功能代替长轮询

问题: 在支持JEE 7的Weblogic 12.2.1.2中,尝试使用以下指南设置WebSocket:

注意:上面的指南非常简单,它所说的都是正确的,“应该”起作用。将不一定在您的应用程序中工作,因为它不在我的应用程序中。但从概念上讲,它应该

尽管如此。 websocket应用程序在从浏览器到后台的握手过程中出错,其中HTTP连接应该升级为tcp/ip web套接字连接

Weblogic抱怨tyrus无法使用Ascyn servlet行为来处理此握手协议。 握手期间错误的堆栈跟踪如下所示:

2017-01-23 14:54:59065线程ID:53错误HTTP-[ServletContext@129852715[应用程序:primefaces-60模块:primefaces-60 路径:null规范版本:3.1]]Servlet失败,出现异常 java.lang.IllegalStateException:此服务器上已禁用异步支持 请求:weblogic.servlet.internal。ServletRequestImpl@2c87c663[得到 /primefaces-60/actions HTTP/1.1连接:升级杂注:无缓存 缓存控制:无缓存升级:websocket来源: Sec WebSocket版本:13用户代理: Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似 Gecko)Chrome/55.0.2883.87 Safari/537.36 DNT:1接受编码:gzip, 放气、sdch、br接受语言: 美国,德国;q=0.8,德国;q=0.6,德国;q=0.4,法国;q=0.2,德国;q=0.2,德国;q=0.2 Sec WebSocket密钥:flKcAkxO3CJBIc8cYvwvlA==Sec WebSocket扩展: permessage deflate;客户端\u最大\u窗口\u位

]在 weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2029) 在 weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2005) 在 servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:432) 在 weblogic.websocket.tyrus.TyrusServletFilter.doFilter(TyrusServletFilter.java:241) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 位于filter.dummytimeofilter2.doFilter(dummytimeofilter2.java:81) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 在 weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3683) 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649) 在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326) 在 weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) 在 weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) 在 weblogic.servlet.provider.WLSSObjectHandle.run(WLSSObjectHandle.java:71) 在 weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433) 在 weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281) 在 weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2259) 在 weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691) 在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651) 在 weblogic.servlet.provider.ContainerSupportProviderImpl$WLSRequesteExecutor.run(ContainerSupportProviderImpl.java:270) 在 weblogic.invocation.ComponentInvocationContextManager.\u运行方式(ComponentInvocationContextManager.java:348) 在 weblogic.invocation.componentinLocationContextManager.runAs(componentinLocationContextManager.java:333) 在 weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54) 在 weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) 在 weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640) 在weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)的 weblogic.work.ExecuteThread.run(ExecuteThread.java:346)

基于这样的假设:设置websocket端点的后端代码是完美的,用于尝试建立websocket连接的javascript代码是完美的。 sombody能否按照信函指南解释为什么会出现上述错误

注: -根据对实际应用程序的分析,上面的堆栈跟踪已经在一个示例应用程序中隔离,该示例应用程序的websocket端点已损坏为上述异常

答案很简单,一旦你知道了。。。
如果没有人支持正确的解决方案,我将在一天左右回答。

来回答我自己的问题

应用程序在尝试打开web套接字连接时遇到的问题与tyrus使用Sevlet 3.0 Specification的特性(即异步servlet处理)有关

即使在最琐碎的web应用程序上,也可能有过滤器,可以交叉应用于所有web请求。 例如,具有筛选器映射/*的筛选器

这正是问题所在。 如以下参考中所述,为了允许异步servlet运行通向servlet的完整过滤器链,servlet必须支持异步请求处理

需要asyncSupported属性来区分编写的代码 用于从中写入以供使用的同步处理
<async-supported>true</async-supported>
<filter>
    <filter-name>AFilter</filter-name>
    <filter-class>webapp.AFilter</filter-class>
    <async-supported>true</async-supported>
</filter>