Java 我是否应该让一个singleton ThreadPoolTaskExecutor共享不同的服务?
根据我的应用程序上下文,我已将ThreadPoolTaskExecutor声明为@Bean,如下所示:Java 我是否应该让一个singleton ThreadPoolTaskExecutor共享不同的服务?,java,spring,threadpool,threadpoolexecutor,Java,Spring,Threadpool,Threadpoolexecutor,根据我的应用程序上下文,我已将ThreadPoolTaskExecutor声明为@Bean,如下所示: @Configuration @ConfigurationProperties(prefix = "application") @EnableCaching public class ApplicationConfig { private static final int POOL_SIZE = 2; @Bean public ThreadPoolTaskExecut
@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;
}
}
我有两个不同的服务需要连接到ThreadPoolTaskExecutor的实例。每个服务都将提交一个Runnable,该Runnable将执行某些特定于服务的工作
例如,以下是两项服务:
@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..."));
}
}
共享两个服务的同一ThreadPoolTaskExecutor实例(因为它是单实例)应该是安全的,对吗
您是否预见到这方面的任何问题,以及我是否应该改为原型?是的,多个服务可以使用同一个执行器。遗嘱执行人所保留的任何状态都不会使其成为一个好主意,将其扔掉并创建一个新的状态 可能有些事情需要注意。如果您向同一执行者提交了持续时间不同的任务,则如果短时间任务排在长时间运行的任务后面,则短时间任务可能会被阻止。您可能希望确保提交给执行者的任务具有类似的持续时间 此外,如果您需要以可预测和可靠的方式执行某些类别的任务,您可能希望为其保留一个专用的执行器。否则,如果这些任务与其他任务共享一个队列,并且存在阻止这些任务完成或使其速度变慢的问题,则您需要可靠执行的任务可能会在它们后面排队 但不,原型范围不应该是必要的