Java 异步线程在SpringMVC3servlet返回之前完成
我正在尝试实现一个异步控制器,如下例所示:Java 异步线程在SpringMVC3servlet返回之前完成,java,multithreading,spring-mvc,servlets,asynchronous,Java,Multithreading,Spring Mvc,Servlets,Asynchronous,我正在尝试实现一个异步控制器,如下例所示: public Callable<Campaign> findCampaignById(@PathVariable Long id) { return new Callable<Campaign>() { @Override public Campaign call() throws Exception { Campaign campaign =
public Callable<Campaign> findCampaignById(@PathVariable Long id) {
return new Callable<Campaign>() {
@Override
public Campaign call() throws Exception {
Campaign campaign = loadCampaign();
//Thread.sleep(2000);
return campaign;
}
};
}
本教程解释了幕后发生的事情:
客户端发送请求
Servlet容器分配线程并调用其中的Servlet
servlet调用request.startAsync,保存AsyncContext并返回
容器线程一直退出,但响应保持打开状态
其他一些线程使用保存的AsyncContext来完成响应
客户端收到响应
问题:
有些情况下,可调用线程可能在servlet返回之前完成。在这种情况下,我得到404页未找到异常。
看起来,如果已经执行了Callable,那么AsyncContext是空的(参见步骤3),因此在步骤5中没有要执行的内容,在步骤6中也没有要返回的内容。
问题:
我做错什么了吗?如何确保在Servlet返回后始终执行Callable?
注意,如果我调用Thread.sleep2000;我从来没有遇到过404异常。loadCampaign现在真的在做什么,还是只是一个存根实现?另外,异步处理的动机是什么?这个问题显然与Weblogic 12有关。Tomcat中报告了相同的问题,并且已经修复