I'm testing a simple chat application which is using Atmosphere framework. When I connect to the application from two browsers everything works like chat should work with Tomcat 7.0 and Websockets protocol is used.
When I downgrade to Tomcat 6.0. or when I use Weblogic 10.3.6 long-polling is used (as expected). With one browser chatting with itself everything works but when I open second browser both windows are disconnected.
I set the log level to TRACE and it seems that Atmosphere is adding every AtmosphereResource with the same UUID set to 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}}
My Chat.java class:
@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));
}
I'm using Atmosphere version 2.3.1. Unfortunately I need long-polling to work because there Weblogic 10.3.6. installed on our production server and it doesn't support Websocket and has implementation of Servlet 2.5. only.
Edit:
It looks like that during the first GET request to the server, server will set UUID for given AtmosphereRequest and returns it to the server with HTTP header
X-Atmosphere-tracking-id=someUUID
but in the subsequent requsts the client is not using it. It is sending to the server
X-Atmosphere-tracking-id=10000
Not sure if this is correct...