annotate servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java @ 1158:2ee261676828 default tip

better out-of-the box experience: * digilib works without config files using sensible defaults * new sample images folder used by default * config files moved to templates
author robcast
date Tue, 19 Feb 2013 17:32:25 +0100
parents 5f03f6937c32
children
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 */
932
5f03f6937c32 nicer code
robcast
parents: 926
diff changeset
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
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
79 // forced destination image type
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
80 String mt = null;
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
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
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
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
f4d3543b6a62 fixed mo=jpeg or png being ignored.
robcast
parents: 829
diff changeset
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
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
137 Scaler.digilibError(errMsgType, Error.UNKNOWN, null,
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
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
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
144 logger.error("AsyncServletWorker TIMED OUT after "
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
145 + (System.currentTimeMillis() - startTime)
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
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
5f03f6937c32 nicer code
robcast
parents: 926
diff changeset
153 Scaler.digilibError(errMsgType, Error.UNKNOWN, "ERROR: timeout rendering image!",
926
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
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
2c70e595e4d7 better timeout log message
robcast
parents: 925
diff changeset
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 }