Using Jetty Bayeux Client in GlassFish v3
Tuesday Mar 10, 2009
In Cometd environment, one can access cometd services through simple Javascript, Java API for Bayeux Protoc, DOJO, etc.
In the Grizzly Issue 174,
developer amplus has contributed a first porting of Jetty Bayeux Java Client to
Grizzly.
A modification of the contribution has been checkin to Grizzly.
The above client code is based on Jetty 6.1.11.
Subsequently, various cometd bugs has been fixed in Grizzly 1.9.8 or later.
In this blog, we will describe how to use the Jetty Bayeux client in Grizzly with GlassFish v3.
Environment Setting
In this moment, comet support is turned off by default. The comet/cometd can be turned on in GlassFish v3 by adding the following property to correspondinghttp-listener.
In our case, it is the http-listener-1.
<property name="cometSupport" value="true">
Note that it is recommended that one should set the above property by using asadmin rather
than directly editing the domain.xml. For instance,
asadmin set server.http-service.http-listener.http-listener-1.property.cometSupport=true
Download the following jars and put it under $GLASSFISH_HOME/domains/domain1/lib:
- grizzly-cometd-client-1.9.8.jar
- cometd-bayeux-6.1.11.jar
- jetty-6.1.11.jar
- jetty-client-6.1.11.jar
- jetty-util-6.1.11.jar
MANIFEST.MF of web-glue.jar.)
The remaining jars are from
Jetty repository 6.1.11.
Finally, we have to start the server.
A Cometd client application using Jetty Bayeux client
In our example, we will create a web Bayeux Client for Cometd Chat Sample. It can be downloaded here.One need to import Jetty's classes as follows:
import org.mortbay.cometd.AbstractBayeux;
import org.mortbay.cometd.client.BayeuxClient;
import org.mortbay.jetty.client.HttpClient;
import org.mortbay.thread.QueuedThreadPool;
import org.mortbay.util.ajax.JSON;
import dojox.cometd.Bayeux;
import dojox.cometd.Client;
import dojox.cometd.Message;
import dojox.cometd.MessageListener;
Then one need to create a BayeuxClient in as follows:
- Create a HttpClient.
httpClient = new HttpClient();
httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
httpClient.setMaxConnectionsPerAddress(50); - Create a QueuedThreadPool for the HttpClient.
QueuedThreadPool pool = new QueuedThreadPool();
pool.setMaxThreads(50);
pool.setDaemon(true);
httpClient.setThreadPool(pool); - Start the HttpClient and create a BayeuxClient.
httpClient.start();
client = new BayeuxClient(httpClient, address, cometdUri) {
public void deliver(Client from, Message message) {
// do something
super.deliver(from, message);
}
};where
addressis anInetSocketAddressandcometdUriis the cometd service uri. - Create a MessageListener for the BayeuxClient.
MessageListener listener = new MessageListener() {
public void deliver(Client fromClient, Client toClient, Message msg) {
Object data = msg.get(AbstractBayeux.DATA_FIELD);
if (data != null) {
// do something
}
}
};
client.addListener(listener);This listener is a no-op as we only use the client to send message in our case.
- Start the BayeuxClient and subscribe the channel.
client.start();
client.subscribe(channel);
Object msg=new JSON.Literal("{\"user\":\"" + name + "\",\"chat\":\"" + chat + "\"}");
client.publish(channel, msg, String.valueOf(mid.getAndIncrement()));
where msg is a JSON object associated to data.
Comparison with Java API for Bayeux Protocol
In this section, we will compare Jetty Bayeux client with the Java API for Bayeux Protocol. For convenience, I will summarize the Java API for Bayeux Protocol as follows:- Get the CometContext.
CometEngine context = CometEngine.getEngine().getCometContext(channel); - Create the DeliverResponse.
Map map = new HashMap();
map.put(messageDataName, messageDataValue);
Data data = new Data();
data.setMapData(map);
DeliverResponse deliverResponse = new DeliverResponse();
deliverResponse.setChannel("/service/echo");
deliverResponse.setClientId(clientId);
deliverResponse.setData(data);
deliverResponse.setLast(true);
deliverResponse.setFollow(true);
deliverResponse.setFinished(true);Note that in this moment, one has to
setFinished(true)in addition tosetLast(true). - Notify the deliverResponse
context.notify(deliverResponse);
| Jetty Bayeux Client | Java API for Bayeux Protocol | |
|---|---|---|
| Setup | more involved | simple |
| Access Cometd Service | local and remote | local |
| Client | in server and standlone | in server |
| Construction of JSON messages | some explicitly | all use API |










