gpt4 book ai didi

java - 一个 @Async 方法中使用的线程池与其他异步方法执行共享

转载 作者:行者123 更新时间:2023-12-02 02:04:46 25 4
gpt4 key购买 nike

我有一个初始化为 @Bean 的线程池,用于专门执行特定的 @Async 方法

class MyConfig {
@Bean(name="myPool")
public static TaskExecutor getExecutor(){
ThreadPooltaskExecutor exec = new ThreadPoolTaskExecutor();
exec.setCorePoolSize(1);
exec.setMaxPoolSize(1);
exec.setThreadNamePrefix("my-thread");
exec.initialize();
return exec;
}
}

上面的线程池作为 bean 用于异步方法调用,如下所示:

public class MyHandler {
...
@Async("myPool")
public void handle(){
...
logger.INFO("do my thing");
...
}
...
}

还有其他类也使用默认的 Spring @Async 池,例如:

public class OtherScheduledTask {
...
@Async
public void doThat() {
logger.INFO("doing that thing");
}
...
}

在运行应用程序时,我可以在日志中看到以下内容:

[pool-1-thread-1] [] c.c.a.m.p.e.c.OtherScheduledTask - do my thing
[myPool] [] c.c.a.m.p.e.c.MyHandler - doing that thing
....

我看到上面的日志片段随机打印,并且异步方法由默认线程池和自定义线程池间歇性执行

我确实有从非异步方法调用 @Async 方法的情况

但是,我仅在 MyHandler 中仅将自定义线程池与一个 @Async 方法 handle() 一起使用,而没有在其他地方使用

为什么 spring 混合线程池(自定义和默认)来执行 @async 方法?

在@Async方法注解中传递bean名称有什么用?

如何使用一个特定的异步方法拥有专用的线程池,以便当它不执行时,让线程池空闲,并且不被用于其他异步方法,这些方法应该仅由默认的 Spring 线程池执行

有关我的环境的详细信息:Spring引导版本1.4.2发布JDK 1.8.0

最佳答案

关于 Spring 和代理的一个关键问题是,许多带注释的功能都使用代理来提供功能。也就是说,@Transactional@Cacheable@Async 都依赖于 Spring 检测这些注释并将这些 bean 包装在代理 bean 中。

既然如此,代理方法只能在类上调用时使用,而不能在类内调用时使用。请参阅this关于主题。

引用评论:

@Dovmo I am invoking one async method with custom pool from non-async method in same class. Other async methods are getting invoked from their respective classes and there is no calls across these methods from other classes

尝试重构并从上下文中的另一个类调用这些 @Async 方法,或者通过 self-autowiring类本身并以这种方式调用异步方法。

关于java - 一个 @Async 方法中使用的线程池与其他异步方法执行共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50984047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com