@Async注释被忽略

时间:2014-04-22 20:31:28

标签: spring asynchronous

我使用@Async注释方法,但它们似乎被忽略了。

这是我的上下文文件:

<task:annotation-driven executor="taskExecutor" />

    <task:executor id="taskExecutor" pool-size="5-25"
        queue-capacity="100" rejection-policy="CALLER_RUNS" />

    <bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="5" />
        <property name="maxPoolSize" value="10" />
        <property name="queueCapacity" value="25" />
    </bean>

当我创建一个runnable和auto wire taskExecutor时,然后调用taskExecutor.execute(runnableThing)它按预期工作。

然而,Spring承诺,如果我们只是将@Async放在一个方法上,它将在功能上做同样的事情。这种情况对我来说并没有发生(或者至少表现远没有那么好,所以我认为现在我没有考虑过它)。

方法很简单,这里有一些伪代码:

import org.springframework.scheduling.annotation.Async;

@Controller
public class MyClass{

//some auto wired stuff for db persistence

@Async
void doStuff(MyObject object){
//does some stuff with object
//write object to database
//send email
}

}

关于其他地方的任何反馈 - 我想这是一些配置的东西,但我无法弄清楚

2 个答案:

答案 0 :(得分:3)

尝试<task:annotation-driven executor="taskExecutor" proxy-target-class="true" />并将CGLIB添加为项目的依赖项

我不太确定应该将@Async添加到控制器的方法中。最好将它添加到从控制器调用的服务方法

答案 1 :(得分:2)

我不确定你的问题是什么,但也许这会有所帮助。

@Async带注释的方法意味着异步运行。但是,您仍然需要调用它。它不会单独运行。如果您需要它自己运行,请使用@Scheduled并使用适当的配置。

使用@Async,获取对包含它的bean的引用,并在该bean上调用该方法。 (由于代理如何工作,您将无法通过从同一对象的其他方法中调用该方法来获得此行为。)

Bean yourBean = ...; // get it
yourBean.asyncMethod();