/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.context.request.async;

import java.util.concurrent.Callable;

import org.springframework.web.context.request.NativeWebRequest;

Sends a 503 (SERVICE_UNAVAILABLE) in case of a timeout if the response is not already committed. As of 4.2.8 this is done indirectly by setting the result to an AsyncRequestTimeoutException which is then handled by Spring MVC's default exception handling as a 503 error.

Registered at the end, after all other interceptors and therefore invoked only if no other interceptor handles the timeout.

Note that according to RFC 7231, a 503 without a 'Retry-After' header is interpreted as a 500 error and the client should not retry. Applications can install their own interceptor to handle a timeout and add a 'Retry-After' header if necessary.

Author:Rossen Stoyanchev
Since:3.2
/** * Sends a 503 (SERVICE_UNAVAILABLE) in case of a timeout if the response is not * already committed. As of 4.2.8 this is done indirectly by setting the result * to an {@link AsyncRequestTimeoutException} which is then handled by * Spring MVC's default exception handling as a 503 error. * * <p>Registered at the end, after all other interceptors and * therefore invoked only if no other interceptor handles the timeout. * * <p>Note that according to RFC 7231, a 503 without a 'Retry-After' header is * interpreted as a 500 error and the client should not retry. Applications * can install their own interceptor to handle a timeout and add a 'Retry-After' * header if necessary. * * @author Rossen Stoyanchev * @since 3.2 */
public class TimeoutCallableProcessingInterceptor implements CallableProcessingInterceptor { @Override public <T> Object handleTimeout(NativeWebRequest request, Callable<T> task) throws Exception { return new AsyncRequestTimeoutException(); } }