Comet with multiple channels
Posted
by
mark_dj
on Stack Overflow
See other posts from Stack Overflow
or by mark_dj
Published on 2011-01-09T19:51:27Z
Indexed on
2011/01/09
19:53 UTC
Read the original article
Hit count: 224
Hello,
I am writing an web app which needs to subscribe to multiple channels via javascript. I am using Atmosphere and Jersey as backend. However the jQuery plugin they work with only supports 1 channel. I've start buidling my own implementation. Now it works oke, but when i try to subscribe to 2 channels only 1 channel gets notified.
Is the XMLHttpRequest blocking the rest of the XMLHttpRequests?
Here's my code:
function AtmosphereComet(url)
{
this.Connected = new signals.Signal();
this.Disconnected = new signals.Signal();
this.NewMessage = new signals.Signal();
var xhr = null;
var self = this;
var gotWelcomeMessage = false;
var readPosition;
var url = url;
var onIncomingXhr = function()
{
if (xhr.readyState == 3)
{
if (xhr.status==200) // Received a message
{
var message = xhr.responseText;
console.log(message);
if(!gotWelcomeMessage && message.indexOf("") > -1)
{
gotWelcomeMessage = true;
self.Connected.dispatch(sprintf("Connected to %s", url));
}
else
{
self.NewMessage.dispatch(message.substr(readPosition));
}
readPosition = this.responseText.length;
}
}
else if (this.readyState == 4)
{
self.disconnect();
}
}
var getXhr = function()
{
if ( window.location.protocol !== "file:" ) {
try {
return new window.XMLHttpRequest();
} catch(xhrError) {}
}
try {
return new window.ActiveXObject("Microsoft.XMLHTTP");
} catch(activeError) {}
}
this.connect = function()
{
xhr = getXhr();
xhr.onreadystatechange = onIncomingXhr;
xhr.open("GET", url, true);
xhr.send(null);
}
this.disconnect = function()
{
xhr.onreadystatechange = null;
xhr.abort();
}
this.send = function(message)
{
}
}
And the test code:
var connection1 = AtmosphereConnection("http://192.168.1.145:9999/botenveiling/b/product/status/2", AtmosphereComet);
var connection2 = AtmosphereConnection("http://192.168.1.145:9999/botenveiling/b/product/status/1", AtmosphereComet);
var output = function(msg)
{
alert(output);
};
connection1.NewMessage.add(output);
connection2.NewMessage.add(output);
connection1.connect();
In AtmosphereConnection I instantiate the given AtmosphereComet with "new". I iterate over the object to check if it has to methods: "send", "connect", "disconnect". The reason for this is that i can switch the implementation later on when i complete the websocket implementation :) However I think the problem rests with the XmlHttpRequest object, or am i mistaken?
P.S.: signals.Signal is a js observer/notifier library: http://millermedeiros.github.com/js-signals/
Testing:
Firefox 3.6.1.3
© Stack Overflow or respective owner