comparison src/org/eclipse/jetty/continuation/Continuation.java @ 917:1fc8ee20cb18

remove doSuspend
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 09 Oct 2016 03:23:55 -0600
parents 3428c60d7cfc
children a5af9ee7cf91
comparison
equal deleted inserted replaced
916:4de7f6e9c453 917:1fc8ee20cb18
142 * @see ContinuationListener 142 * @see ContinuationListener
143 * 143 *
144 */ 144 */
145 public interface Continuation 145 public interface Continuation
146 { 146 {
147 public final static String ATTRIBUTE = "org.eclipse.jetty.continuation"; 147 public final static String ATTRIBUTE = "org.eclipse.jetty.continuation";
148 148
149 /* ------------------------------------------------------------ */ 149 /* ------------------------------------------------------------ */
150 /** 150 /**
151 * Set the continuation timeout. 151 * Set the continuation timeout.
152 * 152 *
153 * @param timeoutMs 153 * @param timeoutMs
154 * The time in milliseconds to wait before expiring this 154 * The time in milliseconds to wait before expiring this
155 * continuation after a call to {@link #suspend()} or {@link #suspend(ServletResponse)}. 155 * continuation after a call to {@link #suspend()} or {@link #suspend(ServletResponse)}.
156 * A timeout of <=0 means the continuation will never expire. 156 * A timeout of <=0 means the continuation will never expire.
157 */ 157 */
158 void setTimeout(long timeoutMs); 158 void setTimeout(long timeoutMs);
159 159
160 /* ------------------------------------------------------------ */ 160 /* ------------------------------------------------------------ */
161 /** 161 /**
162 * Suspend the processing of the request and associated 162 * Suspend the processing of the request and associated
163 * {@link ServletResponse}. 163 * {@link ServletResponse}.
164 * 164 *
165 * <p> 165 * <p>
166 * After this method has been called, the lifecycle of the request will be 166 * After this method has been called, the lifecycle of the request will be
167 * extended beyond the return to the container from the 167 * extended beyond the return to the container from the
168 * {@link Servlet#service(ServletRequest, ServletResponse)} method and 168 * {@link Servlet#service(ServletRequest, ServletResponse)} method and
169 * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)} 169 * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
170 * calls. When a suspended request is returned to the container after 170 * calls. When a suspended request is returned to the container after
171 * a dispatch, then the container will not commit the associated response 171 * a dispatch, then the container will not commit the associated response
172 * (unless an exception other than {@link ContinuationThrowable} is thrown). 172 * (unless an exception other than {@link ContinuationThrowable} is thrown).
173 * </p> 173 * </p>
174 * 174 *
175 * <p> 175 * <p>
176 * When the thread calling the filter chain and/or servlet has returned to 176 * When the thread calling the filter chain and/or servlet has returned to
177 * the container with a suspended request, the thread is freed for other 177 * the container with a suspended request, the thread is freed for other
178 * tasks and the request is held until either: 178 * tasks and the request is held until either:
179 * <ul> 179 * <ul>
180 * <li>a call to {@link #resume()}.</li> 180 * <li>a call to {@link #resume()}.</li>
181 * <li>a call to {@link #complete()}.</li> 181 * <li>a call to {@link #complete()}.</li>
182 * <li>the timeout expires.</li> 182 * <li>the timeout expires.</li>
183 * </ul> 183 * </ul>
184 * <p> 184 * <p>
185 * Typically suspend with no arguments is uses when a call to {@link #resume()} 185 * Typically suspend with no arguments is uses when a call to {@link #resume()}
186 * is expected. If a call to {@link #complete()} is expected, then the 186 * is expected. If a call to {@link #complete()} is expected, then the
187 * {@link #suspend(ServletResponse)} method should be used instead of this method. 187 * {@link #suspend(ServletResponse)} method should be used instead of this method.
188 * </p> 188 * </p>
189 * 189 *
190 * @exception IllegalStateException 190 * @exception IllegalStateException
191 * If the request cannot be suspended 191 * If the request cannot be suspended
192 */ 192 */
193 void suspend(); 193 // void suspend();
194 194
195 195
196 /* ------------------------------------------------------------ */ 196 /* ------------------------------------------------------------ */
197 /** 197 /**
198 * Suspend the processing of the request and associated 198 * Suspend the processing of the request and associated
199 * {@link ServletResponse}. 199 * {@link ServletResponse}.
200 * 200 *
201 * <p> 201 * <p>
202 * After this method has been called, the lifecycle of the request will be 202 * After this method has been called, the lifecycle of the request will be
203 * extended beyond the return to the container from the 203 * extended beyond the return to the container from the
204 * {@link Servlet#service(ServletRequest, ServletResponse)} method and 204 * {@link Servlet#service(ServletRequest, ServletResponse)} method and
205 * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)} 205 * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
206 * calls. When a suspended request is returned to the container after 206 * calls. When a suspended request is returned to the container after
207 * a dispatch, then the container will not commit the associated response 207 * a dispatch, then the container will not commit the associated response
208 * (unless an exception other than {@link ContinuationThrowable} is thrown). 208 * (unless an exception other than {@link ContinuationThrowable} is thrown).
209 * </p> 209 * </p>
210 * <p> 210 * <p>
211 * When the thread calling the filter chain and/or servlet has returned to 211 * When the thread calling the filter chain and/or servlet has returned to
212 * the container with a suspended request, the thread is freed for other 212 * the container with a suspended request, the thread is freed for other
213 * tasks and the request is held until either: 213 * tasks and the request is held until either:
214 * <ul> 214 * <ul>
215 * <li>a call to {@link #resume()}.</li> 215 * <li>a call to {@link #resume()}.</li>
216 * <li>a call to {@link #complete()}.</li> 216 * <li>a call to {@link #complete()}.</li>
217 * <li>the timeout expires.</li> 217 * <li>the timeout expires.</li>
218 * </ul> 218 * </ul>
219 * <p> 219 * <p>
220 * Typically suspend with a response argument is uses when a call to {@link #complete()} 220 * Typically suspend with a response argument is uses when a call to {@link #complete()}
221 * is expected. If a call to {@link #resume()} is expected, then the 221 * is expected. If a call to {@link #resume()} is expected, then the
222 * {@link #suspend()} method should be used instead of this method. 222 * {@link #suspend()} method should be used instead of this method.
223 * </p> 223 * </p>
224 * <p> 224 * <p>
225 * Filters that may wrap the response object should check {@link #isResponseWrapped()} 225 * Filters that may wrap the response object should check {@link #isResponseWrapped()}
226 * to decide if they should destroy/finish the wrapper. If {@link #isResponseWrapped()} 226 * to decide if they should destroy/finish the wrapper. If {@link #isResponseWrapped()}
227 * returns true, then the wrapped request has been passed to the asynchronous 227 * returns true, then the wrapped request has been passed to the asynchronous
228 * handler and the wrapper should not be destroyed/finished until after a call to 228 * handler and the wrapper should not be destroyed/finished until after a call to
229 * {@link #complete()} (potentially using a {@link ContinuationListener#onComplete(Continuation)} 229 * {@link #complete()} (potentially using a {@link ContinuationListener#onComplete(Continuation)}
230 * listener). 230 * listener).
231 * 231 *
232 * @param response The response to return via a call to {@link #getServletResponse()} 232 * @param response The response to return via a call to {@link #getServletResponse()}
233 * @exception IllegalStateException 233 * @exception IllegalStateException
234 * If the request cannot be suspended 234 * If the request cannot be suspended
235 */ 235 */
236 void suspend(ServletResponse response); 236 // void suspend(ServletResponse response);
237 237
238 /* ------------------------------------------------------------ */ 238 /* ------------------------------------------------------------ */
239 /** 239 /**
240 * Resume a suspended request. 240 * Resume a suspended request.
241 * 241 *
242 * <p> 242 * <p>
243 * This method can be called by any thread that has been passed a reference 243 * This method can be called by any thread that has been passed a reference
244 * to a continuation. When called the request is redispatched to the 244 * to a continuation. When called the request is redispatched to the
245 * normal filter chain and servlet processing with {@link #isInitial()} false. 245 * normal filter chain and servlet processing with {@link #isInitial()} false.
246 * </p> 246 * </p>
247 * <p> 247 * <p>
248 * If resume is called before a suspended request is returned to the 248 * If resume is called before a suspended request is returned to the
249 * container (ie the thread that called {@link #suspend()} is still 249 * container (ie the thread that called {@link #suspend()} is still
250 * within the filter chain and/or servlet service method), then the resume 250 * within the filter chain and/or servlet service method), then the resume
251 * does not take effect until the call to the filter chain and/or servlet 251 * does not take effect until the call to the filter chain and/or servlet
252 * returns to the container. In this case both {@link #isSuspended()} and 252 * returns to the container. In this case both {@link #isSuspended()} and
253 * {@link #isResumed()} return true. Multiple calls to resume are ignored. 253 * {@link #isResumed()} return true. Multiple calls to resume are ignored.
254 * </p> 254 * </p>
255 * <p> 255 * <p>
256 * Typically resume() is used after a call to {@link #suspend()} with 256 * Typically resume() is used after a call to {@link #suspend()} with
257 * no arguments. The dispatch after a resume call will use the original 257 * no arguments. The dispatch after a resume call will use the original
258 * request and response objects, even if {@link #suspend(ServletResponse)} 258 * request and response objects, even if {@link #suspend(ServletResponse)}
259 * had been passed a wrapped response. 259 * had been passed a wrapped response.
260 * </p> 260 * </p>
261 * 261 *
262 * @see #suspend() 262 * @see #suspend()
263 * @exception IllegalStateException if the request is not suspended. 263 * @exception IllegalStateException if the request is not suspended.
264 * 264 *
265 */ 265 */
266 void resume(); 266 void resume();
267 267
268 /* ------------------------------------------------------------ */ 268 /* ------------------------------------------------------------ */
269 /** 269 /**
270 * Complete a suspended request. 270 * Complete a suspended request.
271 * 271 *
272 * <p> 272 * <p>
273 * This method can be called by any thread that has been passed a reference 273 * This method can be called by any thread that has been passed a reference
274 * to a suspended request. When a request is completed, the associated 274 * to a suspended request. When a request is completed, the associated
275 * response object committed and flushed. The request is not redispatched. 275 * response object committed and flushed. The request is not redispatched.
276 * </p> 276 * </p>
277 * 277 *
278 * <p> 278 * <p>
279 * If complete is called before a suspended request is returned to the 279 * If complete is called before a suspended request is returned to the
280 * container (ie the thread that called {@link #suspend()} is still 280 * container (ie the thread that called {@link #suspend()} is still
281 * within the filter chain and/or servlet service method), then the complete 281 * within the filter chain and/or servlet service method), then the complete
282 * does not take effect until the call to the filter chain and/or servlet 282 * does not take effect until the call to the filter chain and/or servlet
283 * returns to the container. In this case both {@link #isSuspended()} and 283 * returns to the container. In this case both {@link #isSuspended()} and
284 * {@link #isResumed()} return true. 284 * {@link #isResumed()} return true.
285 * </p> 285 * </p>
286 * 286 *
287 * <p> 287 * <p>
288 * Typically resume() is used after a call to {@link #suspend(ServletResponse)} with 288 * Typically resume() is used after a call to {@link #suspend(ServletResponse)} with
289 * a possibly wrapped response. The async handler should use the response 289 * a possibly wrapped response. The async handler should use the response
290 * provided by {@link #getServletResponse()} to write the response before 290 * provided by {@link #getServletResponse()} to write the response before
291 * calling {@link #complete()}. If the request was suspended with a 291 * calling {@link #complete()}. If the request was suspended with a
292 * call to {@link #suspend()} then no response object will be available via 292 * call to {@link #suspend()} then no response object will be available via
293 * {@link #getServletResponse()}. 293 * {@link #getServletResponse()}.
294 * </p> 294 * </p>
295 * 295 *
296 * <p> 296 * <p>
297 * Once complete has been called and any thread calling the filter chain 297 * Once complete has been called and any thread calling the filter chain
298 * and/or servlet chain has returned to the container, the request lifecycle 298 * and/or servlet chain has returned to the container, the request lifecycle
299 * is complete. The container is able to recycle request objects, so it is 299 * is complete. The container is able to recycle request objects, so it is
300 * not valid hold a request or continuation reference after the end of the 300 * not valid hold a request or continuation reference after the end of the
301 * life cycle. 301 * life cycle.
302 * 302 *
303 * @see #suspend() 303 * @see #suspend()
304 * @exception IllegalStateException 304 * @exception IllegalStateException
305 * if the request is not suspended. 305 * if the request is not suspended.
306 * 306 *
307 */ 307 */
308 void complete(); 308 void complete();
309 309
310 /* ------------------------------------------------------------ */ 310 /* ------------------------------------------------------------ */
311 /** 311 /**
312 * @return true after {@link #suspend()} has been called and before the 312 * @return true after {@link #suspend()} has been called and before the
313 * request has been redispatched due to being resumed, completed or 313 * request has been redispatched due to being resumed, completed or
314 * timed out. 314 * timed out.
315 */ 315 */
316 boolean isSuspended(); 316 boolean isSuspended();
317 317
318 /* ------------------------------------------------------------ */ 318 /* ------------------------------------------------------------ */
319 /** 319 /**
320 * @return true if the request has been redispatched by a call to 320 * @return true if the request has been redispatched by a call to
321 * {@link #resume()}. Returns false after any subsequent call to 321 * {@link #resume()}. Returns false after any subsequent call to
322 * suspend 322 * suspend
323 */ 323 */
324 boolean isResumed(); 324 boolean isResumed();
325 325
326 /* ------------------------------------------------------------ */ 326 /* ------------------------------------------------------------ */
327 /** 327 /**
328 * @return true after a request has been redispatched as the result of a 328 * @return true after a request has been redispatched as the result of a
329 * timeout. Returns false after any subsequent call to suspend. 329 * timeout. Returns false after any subsequent call to suspend.
330 */ 330 */
331 boolean isExpired(); 331 boolean isExpired();
332 332
333 /* ------------------------------------------------------------ */ 333 /* ------------------------------------------------------------ */
334 /** 334 /**
335 * @return true while the request is within the initial dispatch to the 335 * @return true while the request is within the initial dispatch to the
336 * filter chain and/or servlet. Will return false once the calling 336 * filter chain and/or servlet. Will return false once the calling
337 * thread has returned to the container after suspend has been 337 * thread has returned to the container after suspend has been
338 * called and during any subsequent redispatch. 338 * called and during any subsequent redispatch.
339 */ 339 */
340 boolean isInitial(); 340 boolean isInitial();
341 341
342 /* ------------------------------------------------------------ */ 342 /* ------------------------------------------------------------ */
343 /** 343 /**
344 * Is the suspended response wrapped. 344 * Is the suspended response wrapped.
345 * <p> 345 * <p>
346 * Filters that wrap the response object should check this method to 346 * Filters that wrap the response object should check this method to
347 * determine if they should destroy/finish the wrapped response. If 347 * determine if they should destroy/finish the wrapped response. If
348 * the request was suspended with a call to {@link #suspend(ServletResponse)} 348 * the request was suspended with a call to {@link #suspend(ServletResponse)}
349 * that passed the wrapped response, then the filter should register 349 * that passed the wrapped response, then the filter should register
350 * a {@link ContinuationListener} to destroy/finish the wrapped response 350 * a {@link ContinuationListener} to destroy/finish the wrapped response
351 * during a call to {@link ContinuationListener#onComplete(Continuation)}. 351 * during a call to {@link ContinuationListener#onComplete(Continuation)}.
352 * @return True if {@link #suspend(ServletResponse)} has been passed a 352 * @return True if {@link #suspend(ServletResponse)} has been passed a
353 * {@link ServletResponseWrapper} instance. 353 * {@link ServletResponseWrapper} instance.
354 */ 354 */
355 boolean isResponseWrapped(); 355 boolean isResponseWrapped();
356 356
357 357
358 /* ------------------------------------------------------------ */ 358 /* ------------------------------------------------------------ */
359 /** 359 /**
360 * Get the suspended response. 360 * Get the suspended response.
361 * @return the {@link ServletResponse} passed to {@link #suspend(ServletResponse)}. 361 * @return the {@link ServletResponse} passed to {@link #suspend(ServletResponse)}.
362 */ 362 */
363 ServletResponse getServletResponse(); 363 ServletResponse getServletResponse();
364 364
365 /* ------------------------------------------------------------ */ 365 /* ------------------------------------------------------------ */
366 /** 366 /**
367 * Add a ContinuationListener. 367 * Add a ContinuationListener.
368 * 368 *
369 * @param listener 369 * @param listener
370 */ 370 */
371 void addContinuationListener(ContinuationListener listener); 371 void addContinuationListener(ContinuationListener listener);
372 372
373 /* ------------------------------------------------------------ */ 373 /* ------------------------------------------------------------ */
374 /** Set a request attribute. 374 /** Set a request attribute.
375 * This method is a convenience method to call the {@link ServletRequest#setAttribute(String, Object)} 375 * This method is a convenience method to call the {@link ServletRequest#setAttribute(String, Object)}
376 * method on the associated request object. 376 * method on the associated request object.
377 * This is a thread safe call and may be called by any thread. 377 * This is a thread safe call and may be called by any thread.
378 * @param name the attribute name 378 * @param name the attribute name
379 * @param attribute the attribute value 379 * @param attribute the attribute value
380 */ 380 */
381 public void setAttribute(String name, Object attribute); 381 public void setAttribute(String name, Object attribute);
382 382
383 /* ------------------------------------------------------------ */ 383 /* ------------------------------------------------------------ */
384 /** Get a request attribute. 384 /** Get a request attribute.
385 * This method is a convenience method to call the {@link ServletRequest#getAttribute(String)} 385 * This method is a convenience method to call the {@link ServletRequest#getAttribute(String)}
386 * method on the associated request object. 386 * method on the associated request object.
387 * This is a thread safe call and may be called by any thread. 387 * This is a thread safe call and may be called by any thread.
388 * @param name the attribute name 388 * @param name the attribute name
389 * @return the attribute value 389 * @return the attribute value
390 */ 390 */
391 public Object getAttribute(String name); 391 public Object getAttribute(String name);
392 392
393 /* ------------------------------------------------------------ */ 393 /* ------------------------------------------------------------ */
394 /** Remove a request attribute. 394 /** Remove a request attribute.
395 * This method is a convenience method to call the {@link ServletRequest#removeAttribute(String)} 395 * This method is a convenience method to call the {@link ServletRequest#removeAttribute(String)}
396 * method on the associated request object. 396 * method on the associated request object.
397 * This is a thread safe call and may be called by any thread. 397 * This is a thread safe call and may be called by any thread.
398 * @param name the attribute name 398 * @param name the attribute name
399 */ 399 */
400 public void removeAttribute(String name); 400 public void removeAttribute(String name);
401 401
402 /* ------------------------------------------------------------ */ 402 /* ------------------------------------------------------------ */
403 /** 403 /**
404 * Undispatch the request. 404 * Undispatch the request.
405 * <p> 405 * <p>
406 * This method can be called on a suspended continuation in order 406 * This method can be called on a suspended continuation in order
407 * to exit the dispatch to the filter/servlet by throwing a {@link ContinuationThrowable} 407 * to exit the dispatch to the filter/servlet by throwing a {@link ContinuationThrowable}
408 * which is caught either by the container or the {@link ContinuationFilter}. 408 * which is caught either by the container or the {@link ContinuationFilter}.
409 * This is an alternative to simply returning from the dispatch in the case 409 * This is an alternative to simply returning from the dispatch in the case
410 * where filters in the filter chain may not be prepared to handle a suspended 410 * where filters in the filter chain may not be prepared to handle a suspended
411 * request. 411 * request.
412 * </p> 412 * </p>
413 * This method should only be used as a last resort and a normal return is a prefereable 413 * This method should only be used as a last resort and a normal return is a prefereable
414 * solution if filters can be updated to handle that case. 414 * solution if filters can be updated to handle that case.
415 * 415 *
416 * @throws ContinuationThrowable thrown if the request is suspended. The instance of the 416 * @throws ContinuationThrowable thrown if the request is suspended. The instance of the
417 * exception may be reused on subsequent calls, so the stack frame may not be accurate. 417 * exception may be reused on subsequent calls, so the stack frame may not be accurate.
418 */ 418 */
419 public void undispatch() throws ContinuationThrowable; 419 public void undispatch() throws ContinuationThrowable;
420 } 420 }