Ошибка выброса фреймворка Atmosphere на сервер при длительном опросе
Я хочу реализовать простой механизм push в моем приложении. Я использую сервер TomEE 1.7, который использует Tomcat вместе с кучей других пакетов.
Для Атмосферы я использую атмосферу времени исполнения 2.4.3, а на клиенте я использую версию 2.3.1.
Теперь, когда я пытаюсь протолкнуть использование веб-сокетов, у меня все работает нормально, но когда я пытаюсь использовать длинный опрос в качестве транспорта, я получаю следующую ошибку на сервере:
WARNING: Duplicate resource be43d07f-cbb4-412e-9d50-2d047a2e0223. Could be caused by a dead connection not detected by your server. Replacing the old one with the fresh one
browser connected be43d07f-cbb4-412e-9d50-2d047a2e0223
Mar 10, 2016 11:56:36 AM org.atmosphere.cpr.AtmosphereFramework doCometSupport
SEVERE: AtmosphereFramework exception
java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.
at org.apache.catalina.connector.Request.startAsync(Request.java:1658)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1029)
at org.atmosphere.cpr.AtmosphereRequestImpl.startAsync(AtmosphereRequestImpl.java:623)
at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:95)
at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:70)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2287)
at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:191)
at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:177)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.CorsFilter.handleSimpleCORS(CorsFilter.java:302)
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:166)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at com.tradeweb.server.tools.valve.RequestHeaderCopyValve.invoke(RequestHeaderCopyValve.java:41)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
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)
И на клиенте я вижу следующую проблему (в случае с хромом):
GET http://127.0.0.1:43859/report-integrator-war/notification?X-Atmosphere-trac…ype=text%2Fplain%3B%20charset%3Dutf-8&X-atmo-protocol=true&_=1457628996834 net::ERR_INCOMPLETE_CHUNKED_ENCODING
_executeRequest @ atmosphere.js:2123
_reconnect @ atmosphere.js:2232
ajaxRequest.onreadystatechange @ atmosphere.js:2106
atmosphere.js:3258 Thu Mar 10 2016 11:56:36 GMT-0500 (Eastern Standard Time) Atmosphere: ajaxRequest.onreadystatechange, new state: 4
atmosphere.js:3258 Thu Mar 10 2016 11:56:36 GMT-0500 (Eastern Standard Time) Atmosphere: Firing onError, reasonPhrase: maxReconnectOnClose reached
atmosphere.js:3258 Thu Mar 10 2016 11:56:36 GMT-0500 (Eastern Standard Time) Atmosphere: Firing onError, reasonPhrase: maxReconnectOnClose reached
atmosphere.js:3258 Thu Mar 10 2016 11:56:36 GMT-0500 (Eastern Standard Time) Atmosphere: ajaxrequest.onerror
Вот мой web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Portfolio Analytics Integrator</display-name>
<servlet>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<load-on-startup>0</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>AtmosphereServlet</servlet-name>
<url-pattern>/notification/*</url-pattern>
</servlet-mapping>
</web-app>
Здесь мы видим, что я использую = true, но сервер жалуется, что сервлет не поддерживает асинхронные операции.
Я относительно новичок в Атмосфере, поэтому не могу понять, в чем здесь проблема. Также, когда я запускаю код на локальном компьютере, по крайней мере, я могу обмениваться данными через веб-сокеты, но при развертывании кода на серверах атмосфера не может подключиться также с помощью веб-сокетов и возвращается к длительному опросу, что приводит к указанной выше ошибке. То же самое происходит на моем локальном компьютере, когда я использую прокси charles в середине.
1 ответ
Я выяснил проблему и похоже, что это ошибка сервера TomEE 1.7.0. Сервер TomEE, который использовался, был запущен Tomcat 7.0.55.0. Вот вывод version.sh из TomEE:
[web@DEVTWDLNX05 bin]$ ./version.sh
Using CATALINA_BASE: /home/web/servers/apache-tomee-plus
Using CATALINA_HOME: /home/web/servers/apache-tomee-plus
Using CATALINA_TMPDIR: /home/web/servers/apache-tomee-plus/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/web/servers/apache-tomee-plus/bin/bootstrap.jar:/home/web/servers/apache-tomee-plus/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.55
Server built: Jul 18 2014 05:34:04
Server number: 7.0.55.0
OS Name: Linux
OS Version: 3.8.13-55.1.6.el7uek.x86_64
Architecture: amd64
JVM Version: 1.7.0_75-mockbuild_2015_01_20_15_59-b00
JVM Vendor: Oracle Corporation
Когда я запустил код на TomEE 1.7.4, который запускает Tomcat 7.0.68, все работало нормально.
Загадочным моментом является то, что я также запускал тот же код на простом ванильном Tomcat 7.0.55.0, и там код работал отлично, но когда тот же tomcat упакован с сервером TomEE, мы получаем ошибку.