Mercurial > hg > digilib-old
annotate servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java @ 1133:beb7e0f48242
nicer message.
author | robcast |
---|---|
date | Tue, 13 Nov 2012 19:44:19 +0100 |
parents | 5f03f6937c32 |
children |
rev | line source |
---|---|
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
1 /** |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
2 * |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
3 */ |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
4 package digilib.servlet; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
5 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
6 import java.io.IOException; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
7 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
8 import javax.servlet.AsyncContext; |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
9 import javax.servlet.AsyncEvent; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
10 import javax.servlet.AsyncListener; |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
11 import javax.servlet.ServletException; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
12 import javax.servlet.http.HttpServletResponse; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
13 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
14 import org.apache.log4j.Logger; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
15 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
16 import digilib.image.DocuImage; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
17 import digilib.image.ImageJobDescription; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
18 import digilib.image.ImageOpException; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
19 import digilib.image.ImageWorker; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
20 import digilib.servlet.Scaler.ErrMsg; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
21 import digilib.servlet.Scaler.Error; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
22 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
23 /** |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
24 * @author casties |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
25 * |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
26 */ |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
27 public class AsyncServletWorker implements Runnable, AsyncListener { |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
28 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
29 /** the AsyncServlet context */ |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
30 private AsyncContext asyncContext; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
31 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
32 /** the ImageWorker we use */ |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
33 private ImageWorker imageWorker; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
34 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
35 protected static Logger logger = Logger.getLogger(AsyncServletWorker.class); |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
36 private long startTime; |
829 | 37 private ErrMsg errMsgType = ErrMsg.IMAGE; |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
38 private ImageJobDescription jobinfo; |
926 | 39 /** flag to indicate that the response is completed (on abort) */ |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
40 private boolean completed = false; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
41 /** AsyncRequest timeout */ |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
42 protected static long timeout = 60000l; |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
43 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
44 /** |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
45 * @param dlConfig |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
46 * @param jobinfo |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
47 */ |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
48 public AsyncServletWorker(DigilibConfiguration dlConfig, |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
49 ImageJobDescription jobinfo, AsyncContext asyncContext, |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
50 ErrMsg errMsgType, long startTime) { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
51 // set up image worker |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
52 imageWorker = new ImageWorker(dlConfig, jobinfo); |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
53 // save AsyncContext |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
54 this.asyncContext = asyncContext; |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
55 asyncContext.setTimeout(AsyncServletWorker.timeout); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
56 logger.debug("timeout for worker: " + asyncContext.getTimeout() + "ms"); |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
57 this.startTime = startTime; |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
58 this.errMsgType = errMsgType; |
829 | 59 this.jobinfo = jobinfo; |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
60 } |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
61 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
62 /** |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
804
diff
changeset
|
63 * runs the ImageWorker and writes the image to the ServletResponse. |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
64 */ |
932 | 65 @Override |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
66 public void run() { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
67 // get fresh response |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
68 HttpServletResponse response = (HttpServletResponse) asyncContext |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
69 .getResponse(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
70 logger.debug("working on response: (" |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
71 + ServletOps.headersToString(response) + ")"); |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
72 try { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
73 // render the image |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
74 DocuImage img = imageWorker.call(); |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
75 if (completed) { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
76 logger.debug("AsyncServletWorker already completed (after scaling)!"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
77 return; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
78 } |
830 | 79 // forced destination image type |
80 String mt = null; | |
81 if (jobinfo.hasOption("jpg")) { | |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
82 mt = "image/jpeg"; |
830 | 83 } else if (jobinfo.hasOption("png")) { |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
84 mt = "image/png"; |
830 | 85 } |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
86 // send image |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
87 ServletOps.sendImage(img, mt, |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
88 (HttpServletResponse) asyncContext.getResponse(), logger); |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
804
diff
changeset
|
89 logger.debug("Job done in: " |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
90 + (System.currentTimeMillis() - startTime) + "ms"); |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
91 } catch (ImageOpException e) { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
92 logger.error(e.getClass() + ": " + e.getMessage()); |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
93 Scaler.digilibError(errMsgType, Error.IMAGE, null, |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
94 (HttpServletResponse) asyncContext.getResponse()); |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
95 } catch (IOException e) { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
96 logger.error(e.getClass() + ": " + e.getMessage()); |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
97 Scaler.digilibError(errMsgType, Error.FILE, null, |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
98 (HttpServletResponse) asyncContext.getResponse()); |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
99 } catch (ServletException e) { |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
100 logger.error("Servlet error: ", e); |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
804
diff
changeset
|
101 } catch (Exception e) { |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
804
diff
changeset
|
102 logger.error("Other error: ", e); |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
103 } finally { |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
104 if (completed) { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
105 logger.debug("AsyncServletWorker already completed (finally)!"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
106 } else { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
107 // submit response |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
108 logger.debug("context complete."); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
109 this.completed = true; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
110 asyncContext.complete(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
111 } |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
112 } |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
113 |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
114 } |
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
115 |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
116 @Override |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
117 public void onStartAsync(AsyncEvent event) throws IOException { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
118 logger.debug("onStartAsync called (why?)"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
119 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
120 |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
121 @Override |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
122 public void onComplete(AsyncEvent event) throws IOException { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
123 logger.debug("AsyncServletWorker onComplete"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
124 // make sure complete isn't called twice |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
125 this.completed = true; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
126 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
127 |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
128 @Override |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
129 public void onError(AsyncEvent event) throws IOException { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
130 logger.error("AsyncServletWorker onError: " + event.toString()); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
131 if (completed) { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
132 logger.debug("AsyncServletWorker already completed (TimeOut)!"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
133 return; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
134 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
135 imageWorker.stopNow(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
136 this.completed = true; |
926 | 137 Scaler.digilibError(errMsgType, Error.UNKNOWN, null, |
138 (HttpServletResponse) asyncContext.getResponse()); | |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
139 asyncContext.complete(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
140 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
141 |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
142 @Override |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
143 public void onTimeout(AsyncEvent event) throws IOException { |
926 | 144 logger.error("AsyncServletWorker TIMED OUT after " |
145 + (System.currentTimeMillis() - startTime) | |
146 + "ms! (increase worker-timeout?)"); | |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
147 if (completed) { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
148 logger.debug("AsyncServletWorker already completed (TimeOut)!"); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
149 return; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
150 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
151 imageWorker.stopNow(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
152 this.completed = true; |
932 | 153 Scaler.digilibError(errMsgType, Error.UNKNOWN, "ERROR: timeout rendering image!", |
926 | 154 (HttpServletResponse) asyncContext.getResponse()); |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
155 asyncContext.complete(); |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
156 } |
926 | 157 |
925
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
158 public static long getTimeout() { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
159 return timeout; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
160 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
161 |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
162 public static void setTimeout(long timeout) { |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
163 AsyncServletWorker.timeout = timeout; |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
164 } |
66f1ba72d07b
added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents:
903
diff
changeset
|
165 |
804
587c90bc5976
first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff
changeset
|
166 } |