我正在使用基于注释的配置进行Spring Integration Project。 我们从另一个团队继承了这个项目,并试图确定ThreadPoolTaskExecutors是否被正确使用。下面是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上写入一些事件。这些只是了解项目结构的示例。
现在的问题是,任务执行器使用正确吗?如果我们消除了ThreadPoolTaskExecutors并且没有为通道提供它们,那么Spring应该管理线程吗?继续进行第二种方法会出现问题吗?
我想尽可能地学习Spring Integration,这些问题的答案会很有帮助。预先感谢谁能帮助我了解这种行为。
答案 0 :(得分:2)
ThreadPool是我们的助手,它在某些不依赖顺序的进程运行时不保留主线程。但是使用这些池不是强制性的,但是如果没有这些池,恐怕您可能会失去性能或增加失败的机会,因为这些机制通常除了池外还具有某种控制权,例如在池已满或重新使用线程时对事件进行排队。当然,需要检查每种情况以查看哪种情况更合适,但是我相信,如果您不需要这些事件按特定顺序进行,那么我建议您这样处理。
我发现不同的是您的游泳池设置了多大。但是我不知道您的要求,因此我无法得出任何结论。我通常看到的是PoolSize大约为5,maxSize大约为10。另一件事是,您不需要为每个事物分配每个池,对于所有事物来说,一个池也许是合适的。但是正如我所说,我不能说对与错,因为每个系统都有自己的要求。
可能更好的最后一个细节是不对该设置进行硬编码,将application.properties
或maxThreadPoolSize=10
之类的这些信息放入threadPoolSize=5
中,然后在设置bean时访问它。