Archive

Archive for October 14, 2008

Entering the Atmosphere Framework: Comet for Everyone, Everywhere

Introducing Atmosphere, a new framework for building portable Comet based applications. Yes, portable, which means it can run on Tomcat, Jetty, Grizzly/GlassFish or any web server that support Servlet 2.5 … and without the needs to learn all those private API floating around…

IMG_0090 copy.JPG

Currently, writing a portable Comet application is impossible: JBossWeb has AIO, Tomcat has its a different AIO API, Jetty has its Continuation API and pre Servlet 3.0 API support, Grizzly has its Comet Framework and Grizzlet API, etc. So, framework like DWR, ICEFaces and Bindows all added native support and abstracted a layer in order to support different Comet API. Worse, if your application uses those API directly, then you are stuck with one Web Server. Not bad if you are using Grizzly Comet, but if you are using the competitor, then you cannot meet the Grizzly!

The current Servlet EG are working on a proposal to add support for Comet in the upcoming Servlet 3.0 specification, but before the planet fully supports the spec it may takes ages. And the proposal will contains a small subset of the current set of features some containers already supports like asynchronous I/O (Tomcat, Grizzly), container-managed thread pool for concurrently handling the push operations, filters for push operations. etc. Not to say that using Atmosphere, framework will not longer have to care about native implementation, but instead build on top of Atmosphere. Protocol like Bayeux will comes for free, and will run on all WebServer by under the hood using their native API.

So I’m launching Atmosphere, hoping to close the gap and simplify the creation of Comet based application based on the experience/feedback I got since two year with the Grizzly Comet Framework. Atmosphere is a POJO based framework using Inversion of Control (IoC), trying to bring Ajax Push/Comet to the masses! Atmosphere build on top of Jersey and Grizzly Comet code. Now I’ve to be honest, the project is just starting (got some troubles internally since I’ve leaked the information :-)) and it might takes a couple of months before I can support all WebServer. What I’m targeting is to evolve the Grizzlet concept and make the programming model really easy. So far what I have looks like:


/**
 * This Grizzlet can only receive push from that application, e.g. from other Grizzlet defined under the myGrizzlet/* path 
 * (defined using the @Path annotation)
 */
@Grizzlet(Grizzlet.Scope.APPLICATION)
@Path("myGrizzlet")
public class MyGrizzlet{
    /**
     * Broadcast notification to all Grizzlet defined inside the current VM.
     */
    @Broadcaster(Grizzlet.Scope.VM)
    private Broadcaster bc;
    
    /**
     * Suspend the connection for 6000 milliseconds on GET request, and push the 
     * return value.
     */
    @Suspend(6000)
    @GET     
    @Push
    public String onGet(){        
        bc.brodcast("A new user has connected");
        return "Suspending the connection";
    }


    /**
     * On POST, push the return value.
     */
    @POST     
    @Push
    public String onPost(@Context HttpServletRequest req,
                         @Context HttpServletResponse res) throws IOException{  
        res.setStatus(200);
        res.getWriter().println("OK, info pushed");
        return req.getParameter("chatMessage");
    }    
    
    /**
     * Resume the connection after one push (long polling), and push the return
     * value.
     */
    @Resume(1)
    @Push
    public String onPush(String event,@Context HttpServletResponse res) throws IOException{
        res.getWriter().println(event);  
        return "Resuming the connection";
    }
}

The example above is of course quite simple, but it demonstrate the goal I have with Atmosphere: make it easy for anybody to write Comet application. The above is a ridiculous Chat application which suspend request when a GET is sent, push data on POST and just blindly write the “pushed” data.

So, In the upcoming weeks I will start giving more examples and more important, will push the code to the repository. I’m unfortunately distracted by other projects I’m working on so the project might start slowly, but my goal is to build a strong community like I did with the Grizzly Project, hence the project evolve faster and open of anybody….Interested? Just sign to the Atmosphere mailing list. I’ve plenty of work for anybody interested to participate!

var gaJsHost = ((“https:” == document.location.protocol) ? “https://ssl.” : “http://www.”);
document.write(unescape(“%3Cscript src='” + gaJsHost + “google-analytics.com/ga.js’ type=’text/javascript’%3E%3C/script%3E”));

var pageTracker = _gat._getTracker(“UA-3111670-3″);
pageTracker._initData();
pageTracker._trackPageview();

technorati:

Categories: Uncategorized
Follow

Get every new post delivered to your Inbox.

Join 50 other followers