【问题标题】:Should I have a singleton ThreadPoolTaskExecutor to be shared different services?我应该有一个单例 ThreadPoolTask​​Executor 来共享不同的服务吗?
【发布时间】:2018-03-15 07:07:57
【问题描述】:

我已根据我的应用程序上下文将 ThreadPoolTask​​Executor 声明为 @Bean:

@Configuration
@ConfigurationProperties(prefix = "application")
@EnableCaching
public class ApplicationConfig {
    private static final int POOL_SIZE = 2;

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setCorePoolSize(POOL_SIZE);

        return pool;
    }
}

我有 2 个不同的服务需要连接一个 ThreadPoolTask​​Executor 的实例。每个服务都将提交一个 Runnable 来执行一些特定于服务的工作。

例如,以下是 2 个服务:

@Service
public class TerminatedContractsService {
    @Autowired
    private ThreadPoolTaskExecutor taskExec;

    public void notifyTerminatedContracts(Date d) {
        // do some contract specific work
        taskExec.submit(() -> System.out.println("emailing terminated contracts...")); 
    }
}


@Service
public class SalaryCalculationService {
    @Autowired
    private ThreadPoolTaskExecutor taskExec;

    public void calculateSalary(Date d) {
        // do some salary related work
        taskExec.submit(() -> System.out.println("calculating salaries...")); 
    }
}

为两个服务共享同一个 ThreadPoolTask​​Executor 实例(因为它是单例的)应该是安全的吗?

您预见到这有什么问题吗?我是否应该改用原型?

【问题讨论】:

    标签: java spring threadpool threadpoolexecutor


    【解决方案1】:

    是的,多个服务使用同一个执行器是可以的。执行者保留的任何状态都不会使它成为一个好主意,将其丢弃并创建一个新状态。

    有些事情需要注意。如果您有不同持续时间的任务提交给同一个执行程序,那么如果短期任务在长时间运行的任务后面排队,它们可能会被阻止。您可能希望确保提交给执行者的任务具有相似的持续时间。

    此外,如果您需要以可预测且可靠的方式执行某类任务,您可能需要为其预留一个专用执行器。否则,如果这些任务与其他任务共享一个队列并且存在阻止这些任务完成或只是减慢它们的问题,那么您需要可靠执行的任务可能会排在它们后面。

    但是不,原型范围不应该是必需的。

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2020-10-22
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多