在我的应用程序中,我有两个@Async方法:一个用于审计目的,另一个用于在两个完全不同的bean中更新一些映射,这些bean来自不同的bean,但同时调用。一个来自审计侦听器,另一个来自控制器。
我的问题是,它们都在一个线程中运行,即首先运行审计,然后在同一个线程中创建这些映射。因此,如果审计抛出一些异常,则不会创建映射,或者映射抛出错误,审计将不会被记录。
有没有办法,我可以让这两个方法在不同的异步线程中运行。
Method1:
@Async(value="myExecutor")
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void regenerateZoneMapAsync(DemandSource ds) {
System.out.println("\n\n********************Current Thread in Async Class*****************" + Thread
.currentThread());
regenerateZmFilesByDs(ds);
System.out.println("\n\n*********Current Thread********" + Thread.currentThread());
}Method2:
@Async(value="myExecutor")
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void callAudit(DemandSource ds) {
System.out.println("\n\n************Current Thread in Audit Class*********" + Thread
.currentThread());
callAudit(ds);
System.out.println("\n\n***********Current Thread********" + Thread.currentThread());
}为了我自己的清晰性,已经添加了println,以了解执行了哪个线程。我对多线程和春天都很陌生。
我的配置类
<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/> 在使用@Async(value="myExecutor")添加了上面的配置之后,我的代码就完全停止工作了,我的意思是,在其中定义了regenerateZoneMapAsync()的bean,不是从调用bean调用的,因此出现了一些代理问题。
编辑:
我脑海中浮现的一件事是,审计线程能够完成它的处理并将线程发送回池,然后映射选择相同的线程并开始它的处理。
基本上,我希望,如果审计抛出任何错误,并滚动地图更新仍然应该发生。
发布于 2016-06-15 04:30:50
我有我的答案。
如果从另一个bean调用,@Transactional( Propagation.REQUIRES_NEW)总是会创建一个新的事务。
如果从同一个bean调用,则永远不会执行新事务,因为它是@异步,因此它在已经运行的异步线程中启动。
因此,我不得不为我的方法做另一个bean,并且这两个方法同时在两个不同的线程中运行。
我的推荐信是:
@异步有两个限制: 它必须仅应用于公共方法;自调用--从同一个类中调用异步方法--将无法工作; 原因很简单--该方法需要公开才能被代理。而自调用不起作用,因为它绕过代理直接调用底层方法。
http://www.baeldung.com/spring-async
https://stackoverflow.com/questions/37719176
复制相似问题