Je lance un serveur de discussion qui utilise Atmosphere comme framework pour la prise en charge de la Websocket. L'atmosphère utilise Jersey car j'utilise la dépendance maven de l'atmosphère-jersey.Erreur Ambiance + Jersey avec client Tomcat 8 et non-Atmosphère
Le serveur de chat fonctionne sur Tomcat 7 et nous mettez à niveau Tomcat 8.
Un de nos clients utilise Tyrus comme API Java websocket.
Lorsque notre serveur de discussion est déployé sur Tomcat 7 (avec Java 6,7 ou 8), il n'y a aucun problème. Avec notre serveur de chat sur Tomcat 8 (Java 8), notre client de test qui utilise Atmosphere fonctionne bien mais pas le client qui utilise Tyrus. L'erreur que nous voyons est:
2017-01-17 02:36:51,114 ERROR() [http-nio-8443-exec-11] ReflectorServletProcessor (?) - onRequest()
java.lang.IllegalArgumentException: Schema specific part is opaque
at com.sun.jersey.api.uri.UriBuilderImpl.checkSsp(UriBuilderImpl.java:529)
at com.sun.jersey.api.uri.UriBuilderImpl.replacePath(UriBuilderImpl.java:256)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:703)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:135)
at org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:96)
at org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:317)
at org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:160)
at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:199)
at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:107)
at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:66)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2078)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:571)
at org.atmosphere.websocket.DefaultWebSocketProcessor$3.run(DefaultWebSocketProcessor.java:333)
at org.atmosphere.util.VoidExecutorService.execute(VoidExecutorService.java:101)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:328)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:525)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:428)
at org.atmosphere.container.JSR356Endpoint$1.onMessage(JSR356Endpoint.java:213)
at org.atmosphere.container.JSR356Endpoint$1.onMessage(JSR356Endpoint.java:210)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:393)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:494)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:60)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:183)
at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198)
at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:669)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Cela se produit car avec Tomcat 7, l'URL de la requête de la demande de websocket est considérée comme similaire à « http: // localhost: 8080/chat/» (La demande est faite à ws: // localhost: 8080/chat/mais il est changé en http: // quelque part). Mais avec Tomcat 8, l'URL de requête de la requête websocket est similaire à "/ chat /" et le schéma n'est pas là et Jersey jette une erreur. Pour contrer cela, Atmosphere recherche l'en-tête "origin" qui a le schéma lorsqu'un client Atmosphere fait une demande. Mais lorsqu'un client Tyrus fait une demande, cet en-tête "origin" n'inclut pas le schéma http résultant de l'erreur ci-dessus.
Je me demande si quelqu'un a des idées pour une solution simple à cela ou a rencontré un problème similaire. J'ai beaucoup cherché une solution simple, mais je n'en ai pas encore trouvé. Sans un, nous cherchons à cesser d'utiliser Atmosphere et à utiliser quelque chose d'autre qui est beaucoup de refactorisation de code.
Voici quelques liens vers des tickets/bugs autour de ce problème qui sembleraient avoir résolu ce problème mais j'ai les bonnes versions et j'ai toujours des problèmes.
https://bz.apache.org/bugzilla/show_bug.cgi?id=56573 https://github.com/Atmosphere/atmosphere/issues/1839
version Ambiance: 2.4.8
Version Jersey (via l'atmosphère): 1,19
Version Tyrus: 1.13