View Javadoc

1   package org.apache.geronimo;
2   
3   import java.io.IOException;
4   import java.net.URL;
5   import java.util.Date;
6   import java.util.Random;
7   import java.util.concurrent.ExecutorService;
8   import java.util.concurrent.Executors;
9   
10  import javax.servlet.ServletException;
11  import javax.servlet.http.HttpServlet;
12  import javax.servlet.http.HttpServletRequest;
13  
14  import org.apache.ahc.AsyncHttpClient;
15  import org.apache.ahc.codec.HttpRequestMessage;
16  import org.apache.catalina.CometEvent;
17  import org.apache.catalina.CometProcessor;
18  
19  /**
20   * Servlet implementation class for Servlet: AsyncServlet
21   * 
22   * @web.servlet name="AsyncServlet" display-name="AsyncServlet"
23   * 
24   * @web.servlet-mapping url-pattern="/async"
25   * 
26   */
27  public class AsyncServlet extends HttpServlet implements CometProcessor {
28  	@Override
29  	public void destroy() {
30  		// TODO Auto-generated method stub
31  		super.destroy();
32  		ahc.destroyAll();
33  	}
34  
35  	static final long serialVersionUID = 1L;
36  
37  	private String remoteUrl;
38  	private static AsyncHttpClient ahc;
39  
40  	public void init() throws ServletException {
41  		remoteUrl = getServletConfig().getInitParameter("remoteUrl");
42  
43  		ExecutorService threadPool = Executors.newFixedThreadPool(8);
44      ahc = new AsyncHttpClient(threadPool);
45  	}
46  
47  	/**
48  	 * Process the given Comet event.
49  	 * 
50  	 * @param event
51  	 *            The Comet event that will be processed
52  	 * @throws IOException
53  	 * @throws ServletException
54  	 */
55  	public void event(CometEvent event) throws IOException, ServletException {
56  		HttpServletRequest request = event.getHttpServletRequest();
57  
58  		String cometId = request.getSession(true).getId();
59  		System.out.println("");
60  		System.out.println("Session id: " + cometId + " "
61  				+ event.getEventType().toString());
62  
63  		if (event.getEventType() == CometEvent.EventType.BEGIN) {
64  			event.getHttpServletRequest().setAttribute(
65  					"org.apache.tomcat.comet.timeout", new Integer(100 * 1000));
66  			event.setTimeout(100 * 1000);
67  
68  			if (request.getParameter("remoteUrl") != null) {
69  				remoteUrl = request.getParameter("remoteUrl");        
70  			}
71  
72  			String remoteUri = request.getParameter("remoteUri");
73  			if (remoteUri == null) {
74  				remoteUri = "/remoteApp/page";
75  			}
76  			
77  			URL url_connect = new URL(remoteUrl + remoteUri);			
78  			Callback callback = new Callback(event.getHttpServletResponse(), cometId);
79  			//Callback callback = new Callback(event, cometId);
80  			HttpRequestMessage msgRequest = new HttpRequestMessage(url_connect, callback);
81  
82  			// If the file being served has other URIs in it, like say images,
83  			// subsequent calls are made to the remote app to retrieve those.
84  			// We don't want to set new delay times and status codes then.
85  			if (remoteUri.endsWith("page")) {
86  				Integer[] params = generateRandomParams();
87  				msgRequest.setParameter("sessionId", cometId);
88  				msgRequest.setParameter("delay", params[0].toString());
89  				msgRequest.setParameter("code", params[1].toString());
90  				msgRequest.setTimeOut(1500);
91  
92  				System.out.println("sessionId:" + cometId + "; delay:"
93  						+ params[0] + "; code:" + params[1]);
94  			}
95        else {
96  				System.out.println("msg request is " + msgRequest.getPath());
97  			}
98  
99  			msgRequest.setRequestMethod(HttpRequestMessage.REQUEST_GET);			
100 			
101 			try {
102 				callback.setTime(new Date().getTime());
103 				ahc.sendRequest(msgRequest);
104 			} catch (Exception e) {
105 				// TODO Auto-generated catch block
106 				e.printStackTrace();
107 			}
108 		}
109     else if (event.getEventType() == CometEvent.EventType.ERROR) {
110 			event.close();
111 		}
112     else if (event.getEventType() == CometEvent.EventType.END) {
113 			event.close();
114 		}
115 	}
116 
117 	/**
118 	 * @return
119 	 */
120 	protected Integer[] generateRandomParams() {
121 		Integer[] params = new Integer[2];
122 		final int[] codes = new int[] { 200, 302, 403, 404, 500 };
123 
124 		Random generator = new Random();
125 
126 		// generate a random delay between 10ms and 250 ms
127 		int delay = generator.nextInt(2000) + 10;
128 		params[0] = new Integer(delay);
129 
130 		// generate randomly one of http status codes.
131 		int index = generator.nextInt(codes.length);
132 		params[1] = new Integer(codes[index]);
133 
134 		return params;
135 	}
136 
137 }