Servlet 2.5 的 Atmosphere 问题的长轮询
Long-polling with Atmosphere issue with Servlet 2.5
我正在测试一个使用 Atmosphere 框架的简单聊天应用程序。当我从两个浏览器连接到应用程序时,一切正常,就像聊天应该使用 Tomcat 7.0 和 Websockets 协议一样。
当我降级到 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", "" ]
我正在测试一个使用 Atmosphere 框架的简单聊天应用程序。当我从两个浏览器连接到应用程序时,一切正常,就像聊天应该使用 Tomcat 7.0 和 Websockets 协议一样。
当我降级到 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", "" ]