首页 > 解决方案 > 如何为特定进程指定线程池

问题描述

我的配置正在实现 AsyncConfigurer,如下所示:

@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {
    
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(5);
        executor.setCorePoolSize(5);
        executor.setQueueCapacity(500);
        executor.initialize();
        return executor;
    }

新的线程池可以正常工作:

@Component
public class MessageJmsListener {

    @Async
    @EventListener
    public void onApplicationEvent(CustomMessage messageJmsWrapper) {
        log.info("Current thread: {}", Thread.currentThread().getName());
    }

    @Async
    @EventListener
    public void onApplicationEventSecond(SecondCustomMessage messageJmsWrapper) {
        log.info("Second Listener thread: {} , Thread.currentThread().getName());
    }
}

我想实现这样的效果,即对于第一个侦听器,我给一个单独的 bean(线程数),而对于第二个侦听器。这样的事情可能吗?

提前致谢!此致

标签: javaspringasynchronous

解决方案


看起来使用限定符可以帮助你。创建两个不同的执行器并为每个执行器添加不同的限定符。将第一个用于具有一个参数集的第一个侦听器,将第二个用于具有不同参数集的另一个侦听器。请参阅此线程中的示例。

在您的情况下,另一种方法可能是您通过在调用它的注释中添加执行器名称来调用正确的执行器。例子:

@Configuration
@EnableAsync
class ApplicationAsyncConfiguration {

    @Bean(name = "maxThreadingExecutor")
    public Executor maxThreadingExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(5);
        executor.setCorePoolSize(5);
        executor.setQueueCapacity(500);
        executor.initialize();
        return executor;
    }

    @Bean(name = "defaultExecutor")
    public Executor defaultExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(2);
        executor.setCorePoolSize(2);
        executor.setQueueCapacity(500);
        executor.initialize();
        return executor;
    }

}
@Component
public class MessageJmsListener {

    @Async("maxThreadingExecutor")
    @EventListener
    public void onApplicationEvent(CustomMessage messageJmsWrapper) {
        log.info("Current thread: {}", Thread.currentThread().getName());
    }

    @Async("defaultExecutor")
    @EventListener
    public void onApplicationEventSecond(SecondCustomMessage messageJmsWrapper) {
        log.info("Second Listener thread: {}", Thread.currentThread().getName());
    }

}

在此答案中查看更多信息,可能会有所帮助。


推荐阅读