3

我想实现一个异步任务,以及一个立即返回并在后台启动任务的页面。但是,该页面会等待后台任务完成,然后才返回。当我访问/start时,加载页面需要 15 秒。我正在使用 Spring 3.2.0。<task:annotation-driven/>我的test-servlet.xml 中有一行。

奇怪的是,即使我用@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
    }
}
4

2 回答 2

3

你可能需要一个executor。试试这个:

<task:annotation-driven executor="myExecutor" />    
<task:executor id="myExecutor" pool-size="5"/>

编辑:另一种可能的解决方案:改用EnableAsync(自 Spring 3.1 起可用)

于 2013-03-02T11:12:48.677 回答
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方法是公开的。

于 2015-04-02T13:02:26.907 回答