【发布时间】:2016-06-09 07:13:49
【问题描述】:
在我的应用程序中,我有 2 个@Async 方法:一个用于审计目的,另一个用于更新 2 个完全不同的 bean 中的一些映射,这些 bean 从不同的 bean 调用,但同时调用。一个来自 Audit 侦听器,另一个来自控制器。
我的问题是它们都在一个线程中运行,即首先运行审计,然后在同一个线程中创建这些映射。所以,如果审计抛出一些异常,映射不会被创建,或者映射抛出错误,审计不会被记录。
有什么办法,我可以让这两种方法在不同的异步线程中运行。
方法一:
@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());
}
方法二:
@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,以了解执行了哪个线程。我对多线程和 Spring 都是新手。
我的配置类有
<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>
在使用@Async(value="myExecutor") 添加上述配置后,我的代码完全停止工作,我的意思是,在其中定义了regenerateZoneMapAsync() 的bean 不是从我的调用bean 调用的,出现了一些代理问题。
编辑:
我想到的一件事是 Audit 线程是否有可能完成其处理并将线程发送回池,然后 map 选择同一个线程并开始其处理。
基本上我希望如果审计抛出任何错误,并且回滚映射更新应该仍然发生。
【问题讨论】:
-
将您的配置添加到您的问题中。
-
你到底想要什么配置?
-
异步的配置和线程池的配置。
-
使用@Async(value=" myExecutor") 我的代码完全停止工作 -
callAudit并不是真的在自称...接下来,您还没有解释什么停止工作以及它是如何表现出来的(您只是说它停止工作)。这段代码是怎么调用的?
标签: spring multithreading asynchronous spring-async