我应该有一个单独的ThreadPoolTask​​Executor来共享不同的服务吗?

时间:2017-10-04 01:00:52

标签: java spring threadpool threadpoolexecutor

我已根据我的应用程序上下文将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实例(因为它的单例)应该是安全的吗?

您是否预见到这方面的任何问题以及我是否应该改造原型?

1 个答案:

答案 0 :(得分:1)

是的,多个服务可以使用相同的执行程序。遗嘱执行人保留的任何状态都不会使其丢弃并创建一个新的状态。

可以注意一些事情。如果您具有提交给同一执行程序的不同持续时间的任务,则可以阻止短期任务,如果它们排在长时间运行的任务之后。您可能希望确保提交给执行程序的任务具有相似的持续时间。

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

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