/** * Copyright (c) 2005-2012 https://github.com/zhangkaitao * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.sishuok.chapter3.web.interceptor; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.async.CallableProcessingInterceptorAdapter; import java.util.concurrent.Callable; /** * <p>User: Zhang Kaitao * <p>Date: 13-7-18 下午8:23 * <p>Version: 1.0 */ public class MyCallableInterceptor extends CallableProcessingInterceptorAdapter { @Override public <T> void beforeConcurrentHandling(final NativeWebRequest request, final Callable<T> task) throws Exception { System.out.println("=====在startAsyc开启异步 和 提交异步任务到Executor 之前执行"); //此时可以保存一些数据到异步上下文,如spring security的SecurityContextHolder或Shiro的SecurityUtils(Subject) } @Override public <T> void preProcess(final NativeWebRequest request, final Callable<T> task) throws Exception { //此时可以把在beforeConcurrentHandling保存的那些数据绑定到这个线程上(将在一个新线程执行) System.out.println("在Callable.call运行之前执行"); } @Override public <T> void postProcess(final NativeWebRequest request, final Callable<T> task, final Object concurrentResult) throws Exception { System.out.println("在Callable.call运行之后执行"); } @Override public <T> Object handleTimeout(final NativeWebRequest request, final Callable<T> task) throws Exception { //超时时调用,返回值将是超时后的结果 System.out.println("异步任务超时了"); return "error";//返回出错时的结果,将替换掉正常时的结果 } @Override public <T> void afterCompletion(final NativeWebRequest request, final Callable<T> task) throws Exception { //异步任务正常结束时调用 System.out.println("异步任务完成了"); } }