【问题标题】:Spring Integration and ThreadPoolTaskExecutorSpring集成和ThreadPoolTask​​Executor
【发布时间】:2021-01-02 01:02:29
【问题描述】:

我正在开发一个基于注释的配置的 Spring 集成项目。 我们从另一个团队继承了这个项目,并试图弄清楚 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 上写入一些事件。这些只是了解项目结构的示例。

现在的问题是,taskexecutors 的使用是否正确?如果我们消除 ThreadPoolTask​​Executors 并且没有为通道提供它们,那么 Spring 是否应该管理线程?采用第二种方法会不会有问题?

我想尽我所能学习 Spring Integration,这些问题的答案会很有帮助。我提前感谢谁会帮助我理解这种行为。

【问题讨论】:

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


    【解决方案1】:

    ThreadPool 是一个帮助我们在一些不依赖于顺序的进程正在运行时不持有主线程的帮助。但是使用这些池不是强制性的,但我担心没有它们可能会失去性能或增加失败的机会,因为这些机制通常除了池之外还有某种控制,比如池满时排队事件或重用线程.当然,每个案例都需要检查以查看更适合的情况,但我相信如果您不需要这些事件按特定顺序发生,我建议您让它这样。

    我发现不同的是您设置的池有多大。但我不知道你的要求,所以我不能就此作出任何结论。我通常看到的是 PoolSize 像 5 和 maxSize 像 10。另一件事是,也许您不需要每个池来处理每一件事,一个适合所有人的可能是合适的。但正如我所说,我不能说是对是错,因为每个系统都有自己的要求。

    最后一个可能更好的细节是不要对这个设置进行硬编码,输入你的application.properties这些信息,比如maxThreadPoolSize=10threadPoolSize=5,然后在你设置bean的那一刻访问它。

    【讨论】:

    • 感谢您的回复。您的回答对理解一些概念很有帮助。 corePoolSize 的初始值为 10,由于速度下降,我们增加了它。特别是我们注意到请求被排队并且直到线程变得空闲才被处理。此外,部署应用程序的机器在负载时刻没有受到压力。事实上,与消除线程池相关的问题是了解是否有可能充分利用机器资源,让框架直接管理线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2017-03-02
    • 1970-01-01
    • 2018-07-29
    • 2015-08-09
    • 2022-06-19
    • 2018-02-20
    相关资源
    最近更新 更多