我使用@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
}
}
关于其他地方的任何反馈 - 我想这是一些配置的东西,但我无法弄清楚
答案 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();