Author: fhanik
Date: Fri Jun 15 14:31:45 2007
New Revision: 547792

URL: http://svn.apache.org/viewvc?view=rev&rev=547792
Log:
Added in AJAX with delayed response example

Modified:
    tomcat/trunk/webapps/docs/aio.xml

Modified: tomcat/trunk/webapps/docs/aio.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/aio.xml?view=diff&rev=547792&r1=547791&r2=547792
==============================================================================
--- tomcat/trunk/webapps/docs/aio.xml (original)
+++ tomcat/trunk/webapps/docs/aio.xml Fri Jun 15 14:31:45 2007
@@ -282,6 +282,133 @@
   </subsection>
 
   <subsection name="Example code snippets">
+  <p>Let's start with a real world example of how you could use Comet to 
handle AJAX requests.
+     An AJAX request is a complete HTTP request, followed by a complete HTTP 
response.
+     The next request is a new HTTP request.
+     There are many AJAX frameworks, and they can be used with regular 
servlets, so why
+     would I want to do this using Comet?
+     The answer is simply, with Comet you can do the response asynchronously 
and therefor
+     release the Tomcat thread to handle other requests.
+  
+  </p>
+  <source>
+Non blocking read and writes 
+
+public class ExampleDelayedAjaxResponse implements CometProcessor {
+ ...
+ public class DelayedResponder extends Thread {
+   public void run() {
+     ...
+     Client[] clients = getClients();
+     for (int i=0; i&lt;clients.length; i++ ) {
+       CometEvent event = client.getEvent();
+       byte[] data = getDelayedResponse(event);
+       if (data!=null) {
+         if (event.isWriteable()) {
+           event.getHttpServletResponse().getOutputStream().write(data);
+           if (event.isWriteable()) { //did we write it all?
+              event.close(); //close the event, in anticipation of the next 
request
+              event.register(OP_CALLBACK); //triggers an END event
+           } else { //we didn't write it all, trigger a WRITE event when we 
are done with the write               event.register(OP_WRITE);
+           }
+         } else {
+           //we are not able to write, let us know when we can
+           event.register(OP_WRITE);
+         }
+         //remove the client from the  async thread
+         //since we have received the data for this client.
+         clients.remove(event);
+       }
+     }
+     ...
+   }
+ }
+ ...
+ public void event(CometEvent event) throws IOException, ServletException {
+   ...
+   if ( event.getEventType() == CometEvent.EventType.BEGIN ) {
+     //configure non blocking
+     event.configureBlocking(false);
+     //deregister for READ since we want to enable pipe lining on the 
connection      //for the next HTTP request
+     event.unregister(OP_READ);
+     //add the client to the list
+     clients.add(event);
+   } if ( event.getEventType() == CometEvent.EventType.READ ) {
+     //read client Id and stock list from client
+     //and add the event to our list
+     assert("this should never happen");
+   } if ( event.getEventType() == CometEvent.EventType.WRITE ) {
+     //unregister from the write event
+     event.unregister(OP_WRITE);
+     //we can now write
+     byte[] data = getDelayedResponse(event);           
+     if ( data != null ) {
+       event.getHttpServletResponse().getOutputStream().write(data);
+     }
+     if( data==null || event.isWriteable() ) {
+       event.close();
+     }
+   } if ( event.getEventType() == CometEvent.EventType.END ) {
+     clients.remove(event);         } else if (...) {
+     ...
+   }
+   ...
+ }
+}
+
+Blocking read and writes
+public class ExampleDelayedAjaxResponse implements CometProcessor {
+ ...
+ public class DelayedResponder extends Thread {
+   public void run() {
+     ...
+     Client[] clients = getClients();
+     for (int i=0; i&lt;clients.length; i++ ) {
+       CometEvent event = client.getEvent();
+       byte[] data = getDelayedResponse(event);
+       if (data!=null) {
+         //register for a write, better do that on a thread pool thread
+         //since write is blocking
+         event.register(OP_WRITE);
+         //remove the client from the  async thread
+         clients.remove(event);
+       }
+     }
+     ...
+   }
+ }
+ ...
+ public void event(CometEvent event) throws IOException, ServletException {
+   ...
+   if ( event.getEventType() == CometEvent.EventType.BEGIN ) {
+     //configure blocking
+     event.configureBlocking(true);
+     //deregister for READ since we want to enable pipe lining on the 
connection      //for the next HTTP request
+     event.unregister(OP_READ);
+     //add the client to the list
+     clients.add(event);
+   } if ( event.getEventType() == CometEvent.EventType.READ ) {
+     //read client Id and stock list from client
+     //and add the event to our list
+     assert("this should never happen");
+   } if ( event.getEventType() == CometEvent.EventType.WRITE ) {
+     //unregister from the write event
+     event.unregister(OP_WRITE);
+     //we can now write
+     byte[] data = getDelayedResponse(event);           //note we don't have 
to check for null data here
+     event.getHttpServletResponse().getOutputStream().write(data);
+     event.close();
+   } if ( event.getEventType() == CometEvent.EventType.END ) {
+     clients.remove(event);
+   } else if (...) {
+     ...
+   }
+   ...
+ }
+}   
+  
+  </source>
+
   <p>
     Imagine you are writing a servlet that is updating a set of 
     stock tickers. You have a back ground thread that is receiving 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to