Servlet 2.5 的 Atmosphere 问题的长轮询

Long-polling with Atmosphere issue with Servlet 2.5

我正在测试一个使用 Atmosphere 框架的简单聊天应用程序。当我从两个浏览器连接到应用程序时,一切正常,就像聊天应该使用 Tomcat 7.0Websockets 协议一样。

当我降级到 Tomcat 6.0. 或当我使用 Weblogic 10.3.6 时使用长轮询 (正如预期的那样)。使用一个浏览器与自己聊天,一切正常,但是当我打开第二个浏览器时,两个 windows 都断开连接。

我将日志级别设置为 TRACE,似乎 Atmosphere 正在添加每个 AtmosphereResource,并将相同的 UUID 设置为 10000:

TRACE [http-8080-6] o.a.c.DefaultAtmosphereResourceFactory [DefaultAtmosphereResourceFactory.java:309] Adding: AtmosphereResource{ uuid=10000, transport=LONG_POLLING, isInScope=true, isResumed=false, isCancelled=false, isSuspended=true, broadcasters=/chat, isClosedByClient=false, isClosedByApplication=false, action=Action{timeout=-1, type=SUSPEND}}

我的Chat.javaclass:

    @AtmosphereHandlerService(path = "/chat", 
broadcasterCache = UUIDBroadcasterCache.class,
                interceptors = {
                        AtmosphereResourceLifecycleInterceptor.class,
                        BroadcastOnPostAtmosphereInterceptor.class,
                        SuspendTrackerInterceptor.class,
                        HeartbeatInterceptor.class
                },
                broadcaster = SimpleBroadcaster.class
        )
        public class Chat extends OnMessage<String> {
            private final Logger logger = LoggerFactory.getLogger(Chat.class);
            private final JacksonDecoder decoder = new JacksonDecoder();
            private final JacksonEncoder encoder = new JacksonEncoder();


        @Override
        public void onMessage(AtmosphereResponse response, String message) throws IOException {
            Message mes = decoder.decode(message);
            logger.info("{} just send {}", mes.getAuthor(), mes.getMessage());
            response.write(encoder.encode(mes));
        }

我正在使用 Atmosphere 版本 2.3.1。 不幸的是,我需要长轮询才能工作,因为有 Weblogic 10.3.6。安装在我们的生产服务器上,它不支持 Websocket 并且只实现了 Servlet 2.5.

编辑:

看起来在对服务器的第一个 GET 请求期间,服务器将为给定的 AtmosphereRequest 和 [=65= 设置 UUID ] 它通过 HTTP header

发送到服务器

X-Atmosphere-tracking-id=someUUID

但在随后的请求中客户端没有使用它。正在发送到服务器

X-Atmosphere-tracking-id=10000

不确定这是否正确...

经过一些调试后,我解决了这个问题。

问题是我在 application.js 库中使用

trackMessageLength: true

在请求对象中,但没有定义 TrackMessageSize 拦截器。

Atmosphere.js 库正在解析以下数组而不是 1。它采用 2.value 并将其设置为 UUID 的值。

["0af719e9-4776-4af1-9925-19c2bb10b547", "10000", "X", "" ]