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
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
80 HttpRequestMessage msgRequest = new HttpRequestMessage(url_connect, callback);
81
82
83
84
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
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
127 int delay = generator.nextInt(2000) + 10;
128 params[0] = new Integer(delay);
129
130
131 int index = generator.nextInt(codes.length);
132 params[1] = new Integer(codes[index]);
133
134 return params;
135 }
136
137 }