【问题标题】:How can I have @Async work on 2 different threads for 2 different methods in Spring.?我怎样才能让@Async 在 Spring 中为 2 个不同的方法在 2 个不同的线程上工作。?
【发布时间】: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


【解决方案1】:

嗯,我得到了答案。

@Transactional(propagation = Propagation.REQUIRES_NEW) 如果从另一个 bean 调用,总是会创建一个新事务。

如果从同一个 bean 调用,则永远不会进行新事务,并且由于它是 @Async ,它在已经运行的 Async 线程中启动。

因此,我不得不为我的方法制作另一个 bean,并且这两个方法开始同时在 2 个不同的线程中运行。

我的参考来自:

@Async 有两个限制:

它只能应用于公共方法; 自调用——从同一个类中调用异步方法——不起作用;

原因很简单——该方法需要公开,以便它可以被代理。 并且自调用不起作用,因为它绕过了代理和 直接调用底层方法。

http://www.baeldung.com/spring-async

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多