【问题标题】:How to specify a thread pool for a specific process如何为特定进程指定线程池
【发布时间】:2021-03-11 16:48:45
【问题描述】:

我的配置实现了 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(线程数),而为第二个侦听器提供一个单独的 bean。这样的事情可能吗?

提前致谢! 最好的问候

【问题讨论】:

    标签: java spring asynchronous


    【解决方案1】:

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

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

    @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());
        }
    
    }
    

    this answer 中查看更多信息,可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多