我想实现一个异步任务,以及一个立即返回并在后台启动任务的页面。但是,页面会等待后台任务完成,然后才返回。当我访问/start
时,加载页面需要15秒。我正在使用Spring 3.2.0。我的test-servlet.xml中有一行包含<task:annotation-driven/>
。
奇怪的是,即使我用@Async(“this_bean_does_not_exist”)替换@Async,应用程序也会这样做(尽管我希望引用一个不存在的bean的例外)。
public interface AsyncTestService {
void startSlowProcess();
}
@Service
public class AsyncTestServiceImpl implements AsyncTestService {
@Override
@Async
public void startSlowProcess() {
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
@Controller
public class TestController {
@Autowired
AsyncTestService asyncTestService;
@RequestMapping("/start")
@ResponseBody
public String startSlowProcess() {
asyncTestService.startSlowProcess(); // It takes 15s to complete
return "STARTED"; // should return immediately
}
}
答案 0 :(得分:3)
您可能需要executor。试试这个:
<task:annotation-driven executor="myExecutor" />
<task:executor id="myExecutor" pool-size="5"/>
编辑:另一种可能的解决方案:使用EnableAsync代替(自春季3.1开始提供)
答案 1 :(得分:0)
首先让你的.xml
配置看起来像:
<task:scheduler id="myScheduler" pool-size="10" />
<task:executor id="myExecutor" pool-size="10" />
<task:annotation-driven executor="myExecutor" scheduler="myScheduler" proxy-target-class="true" />
(是的,调度程序计数和执行程序线程池大小是可配置的)
或者只使用默认值:
<!-- enable task annotation to support @Async, @Scheduled, ... -->
<task:annotation-driven />
其次要确保@Async
方法是公开的。