annotate servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java @ 926:2c70e595e4d7

better timeout log message
author robcast
date Mon, 19 Dec 2011 21:55:49 +0100
parents 66f1ba72d07b
children 5f03f6937c32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
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
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
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
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
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 */
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
65 public void run() {
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
66 // get fresh response
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
67 HttpServletResponse response = (HttpServletResponse) asyncContext
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
68 .getResponse();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
69 logger.debug("working on response: ("
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
70 + ServletOps.headersToString(response) + ")");
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
71 try {
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
72 // render the image
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
73 DocuImage img = imageWorker.call();
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
74 if (completed) {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
75 logger.debug("AsyncServletWorker already completed (after scaling)!");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
76 return;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
77 }
830
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
78 // forced destination image type
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
79 String mt = null;
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
80 if (jobinfo.hasOption("jpg")) {
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
81 mt = "image/jpeg";
830
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
82 } else if (jobinfo.hasOption("png")) {
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
83 mt = "image/png";
830
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
84 }
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
85 // send image
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
86 ServletOps.sendImage(img, mt,
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
87 (HttpServletResponse) asyncContext.getResponse(), logger);
819
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 804
diff changeset
88 logger.debug("Job done in: "
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
89 + (System.currentTimeMillis() - startTime) + "ms");
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
90 } catch (ImageOpException e) {
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
91 logger.error(e.getClass() + ": " + e.getMessage());
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
92 Scaler.digilibError(errMsgType, Error.IMAGE, null,
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
93 (HttpServletResponse) asyncContext.getResponse());
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
94 } catch (IOException e) {
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
95 logger.error(e.getClass() + ": " + e.getMessage());
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
96 Scaler.digilibError(errMsgType, Error.FILE, null,
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
97 (HttpServletResponse) asyncContext.getResponse());
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
98 } catch (ServletException e) {
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
99 logger.error("Servlet error: ", e);
819
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 804
diff changeset
100 } catch (Exception e) {
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 804
diff changeset
101 logger.error("Other error: ", e);
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
102 } finally {
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
103 if (completed) {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
104 logger.debug("AsyncServletWorker already completed (finally)!");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
105 } else {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
106 // submit response
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
107 logger.debug("context complete.");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
108 this.completed = true;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
109 asyncContext.complete();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
110 }
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
111 }
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
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
115 @Override
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
116 public void onStartAsync(AsyncEvent event) throws IOException {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
117 logger.debug("onStartAsync called (why?)");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
118 }
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 @Override
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
121 public void onComplete(AsyncEvent event) throws IOException {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
122 logger.debug("AsyncServletWorker onComplete");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
123 // make sure complete isn't called twice
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
124 this.completed = true;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
125 }
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 @Override
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
128 public void onError(AsyncEvent event) throws IOException {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
129 logger.error("AsyncServletWorker onError: " + event.toString());
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
130 if (completed) {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
131 logger.debug("AsyncServletWorker already completed (TimeOut)!");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
132 return;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
133 }
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
134 imageWorker.stopNow();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
135 this.completed = true;
926
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
136 Scaler.digilibError(errMsgType, Error.UNKNOWN, null,
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
137 (HttpServletResponse) asyncContext.getResponse());
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
138 asyncContext.complete();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
139 }
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 @Override
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
142 public void onTimeout(AsyncEvent event) throws IOException {
926
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
143 logger.error("AsyncServletWorker TIMED OUT after "
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
144 + (System.currentTimeMillis() - startTime)
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
145 + "ms! (increase worker-timeout?)");
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
146 if (completed) {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
147 logger.debug("AsyncServletWorker already completed (TimeOut)!");
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
148 return;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
149 }
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
150 imageWorker.stopNow();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
151 this.completed = true;
926
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
152 Scaler.digilibError(errMsgType, Error.UNKNOWN, null,
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
153 (HttpServletResponse) asyncContext.getResponse());
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
154 asyncContext.complete();
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
155 }
926
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
156
925
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
157 public static long getTimeout() {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
158 return timeout;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
159 }
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 public static void setTimeout(long timeout) {
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
162 AsyncServletWorker.timeout = timeout;
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
163 }
66f1ba72d07b added timeout-parameter and timeout-handler to AsyncServletWorker.
robcast
parents: 903
diff changeset
164
804
587c90bc5976 first version using officially approved Servlet 3.0 async support.
robcast
parents:
diff changeset
165 }