我正在尝试为我的spring应用程序创建一个lib。它有一个预定的作业,它是自动配置的,并且在大多数情况下都包含Maven依赖。
我有一个webapp,它基本上只是向其他webapps发送请求(一些基本的负载测试和失败检测)。请求者实现是完全异步的(它也有一个手动配置的异步执行器)。 Web应用程序也有定期作业,但它在2分钟的时间范围内无法可靠地完成其工作。它仍然很好。 BUT。
当我开始在第二个描述的服务器上使用我的第一个描述的lib时,lib开始工作不可靠。它不再每2分钟触发一次。我没有足够的弹簧知识来找出原因。
我最好的选择是服务器泛洪方法启动了很多异步任务,调度程序也启动了这些任务,这些请求也会转到同一个消息队列。
是否有任何方法可以将我的libs计划任务与其他服务器计划任务分开,并使它们每2分钟运行一次?
答案 0 :(得分:0)
所以我的研究很有趣......似乎只有配置异步执行程序才会强制调度程序使用它。但是,如果您也实现了schedulerConfigurer,那么您将获得另一个专用于计划任务的线程池。
所以我的实现类似于2线程池。
@SpringBootApplication
@EnableAsync
@EnableScheduling
@ComponentScan
public class WebService extends AsyncConfigurerSupport implements SchedulingConfigurer {
public static void main(String[] args) {
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("spring.config.name", "web-server");
SpringApplication.run(WebService.class, args);
}
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("tester-");
executor.initialize();
return executor;
}
@Bean(destroyMethod = "shutdown", name = "scheduledExecutor")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
@Autowired
@Qualifier(value="scheduledExecutor")
Executor scheduledExecutor;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(scheduledExecutor);
}
如果我可以为我的lib创建一个单独的线程池,还是不够清楚,但它现在已经足够好了。