Spring Integration和ThreadPoolTask​​Executor

时间:2020-09-15 09:31:39

标签: java spring spring-integration publish-subscribe threadpoolexecutor

我正在使用基于注释的配置进行Spring Integration Project。 我们从另一个团队继承了这个项目,并试图确定ThreadPoolTask​​Executors是否被正确使用。下面是TaskExecutors的配置:

@Bean
public TaskExecutor businessTaskExecutor() {
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
    pool.setCorePoolSize(30);
    pool.setMaxPoolSize(Integer.MAX_VALUE);
    pool.setQueueCapacity(Integer.MAX_VALUE);
    return pool;
}

@Bean
public TaskExecutor eventTaskExecutor() {
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
    pool.setCorePoolSize(30);
    pool.setMaxPoolSize(Integer.MAX_VALUE);
    pool.setQueueCapacity(Integer.MAX_VALUE);
    return pool;
}

定义了5个以上的TaskExecutor。我不是专家,但我知道可以对它们进行不同的配置。这些执行程序的用法如下:

@Bean
public MessageChannel inputChannel() {
    return new PublishSubscribeChannel(businessTaskExecutor());
}

@Bean
public MessageChannel outputChannel() {
    PublishSubscribeChannel outputChannel = new PublishSubscribeChannel(
            businessTaskExecutor());
    outputChannel
            .addInterceptor(new WireTap(eventTrackerChannel()));
    return outputChannel;
}

@Bean
public MessageChannel eventTrackerChannel() {
    return new ExecutorChannel(eventTaskExecutor());
}

某些ServiceActivator中使用了输入和输出通道。 eventTrackerChannel用于拆分Spring Integration流并在DB上写入一些事件。这些只是了解项目结构的示例。

现在的问题是,任务执行器使用正确吗?如果我们消除了ThreadPoolTask​​Executors并且没有为通道提供它们,那么Spring应该管理线程吗?继续进行第二种方法会出现问题吗?

我想尽可能地学习Spring Integration,这些问题的答案会很有帮助。预先感谢谁能帮助我了解这种行为。

1 个答案:

答案 0 :(得分:2)

ThreadPool是我们的助手,它在某些不依赖顺序的进程运行时不保留主线程。但是使用这些池不是强制性的,但是如果没有这些池,恐怕您可能会失去性能或增加失败的机会,因为这些机制通常除了池外还具有某种控制权,例如在池已满或重新使用线程时对事件进行排队。当然,需要检查每种情况以查看哪种情况更合适,但是我相信,如果您不需要这些事件按特定顺序进行,那么我建议您这样处理。

我发现不同的是您的游泳池设置了多大。但是我不知道您的要求,因此我无法得出任何结论。我通常看到的是PoolSize大约为5,maxSize大约为10。另一件事是,您不需要为每个事物分配每个池,对于所有事物来说,一个池也许是合适的。但是正如我所说,我不能说对与错,因为每个系统都有自己的要求。

可能更好的最后一个细节是不对该设置进行硬编码,将application.propertiesmaxThreadPoolSize=10之类的这些信息放入threadPoolSize=5中,然后在设置bean时访问它。