我已根据我的应用程序上下文将ThreadPoolTaskExecutor声明为@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个不同的服务需要连接一个ThreadPoolTaskExecutor实例。每个服务都将提交一个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..."));
}
}
对于两种服务共享相同的ThreadPoolTaskExecutor实例(因为它的单例)应该是安全的吗?
您是否预见到这方面的任何问题以及我是否应该改造原型?
答案 0 :(得分:1)
是的,多个服务可以使用相同的执行程序。遗嘱执行人保留的任何状态都不会使其丢弃并创建一个新的状态。
可以注意一些事情。如果您具有提交给同一执行程序的不同持续时间的任务,则可以阻止短期任务,如果它们排在长时间运行的任务之后。您可能希望确保提交给执行程序的任务具有相似的持续时间。
此外,如果您需要以可预测且可靠的方式执行某些类别的任务,则可能需要为其保留专用执行程序。否则,如果这些任务与其他任务共享一个队列,并且存在阻止这些任务完成或只是减慢它们的问题,那么您需要可靠执行的任务可能会在它们后面排队等候。
但不,原型范围不应该是必要的。