Spring中的异步过程

时间:2013-11-18 11:56:58

标签: java multithreading spring

我的控制器中有以下内容

@RequestMapping("/")
@ResponseBody
public String index() {
    System.out.println("Parent: " + Thread.currentThread().getName());
    task();
    return "Hello";
}

@Async("executorWithPoolSizeRange")
public void task() {
    try {
        System.out.println("Child Process: "
                + Thread.currentThread().getName());
        System.out.println("................................. started");
        Thread.sleep(5000);
        System.out.println("................................. done");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

我还添加了

    <task:annotation-driven executor="executorWithPoolSizeRange" />
<task:executor id="executorWithPoolSizeRange" pool-size="5-25"
    queue-capacity="100"></task:executor>

到我的mvc-dispatcher-servlet.xml。我还错过了什么吗?该过程不是异步工作。控制器需要5秒才能返回响应,并且线程名称的输出都相同。这是它的相同主题。 (我知道我不应该依赖线程名称,因为它自动设置)

2 个答案:

答案 0 :(得分:3)

我认为您的方法调用不是异步的原因是因为您在同一个组件中调用该方法。春天创建的方法的异步代理只能由对您的task()方法进行“外部”调用的其他服务看到。

尝试将您的task()方法移出控制器并进入服务。然后,当您从控制器调用该方法时,您应该调用“异步”版本。

答案 1 :(得分:0)

您是否尝试过BlockingQueue。它将简化您的异步任务,并基于生产者消费者方法,消费者将以异步方式执行您的任务。 有关详细信息,请参阅此link