我正在使用Spring Boot构建一个基于异步API的解决方案,其中我将Executor Service用于多线程。该代码将在多个服务器上运行。因此,对于我的服务器故障转移逻辑,我计划在Postgres DB中添加进程ID和服务器IP地址。我将拥有一个crontab作业设置,该设置将检查所有实例的运行状况,如果一个实例失败,我将获取与该服务器IP(从数据库)关联的所有进程ID,然后在另一台服务器上重新触发这些作业。
假设我有15个线程的固定线程池,而我有30个线程。 15个将在运行,其余15个将在执行器服务中排队。而且,如果服务器现在出现故障,至少我将获得有关正在运行的服务器的详细信息,但是我将丢失正在排队的服务器的进程ID。因此,我关心的是,一旦我们将其添加到executor服务中,就将进程ID与服务器ips一起存储,而不必等待进程启动。有什么机制吗?
对于故障转移逻辑,我没有做太多尝试,因为它仍然是我计划要做的事情。我已经编写了将作业放入执行程序服务的代码,它将根据固定的线程池大小启动作业。
这是我在Spring Boot中为执行程序服务设置的配置
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "fixedThreadPool")
public ExecutorService fixedThreadPool() {
return Executors.newFixedThreadPool(15);
}
}
这是从控制器调用的异步方法。
public void asyncMethodToCreateFile(String requestId) {
String currentIpAddress= 'some logic to get the ip';
writeStatusInDb(requestId,currentIpAddress)
System.out.println("In asyncMethodToCreateFile() method...");
service.writeToFile(requestId);
}
在这里,我想在执行程序服务中添加writeStatusInDb()方法后立即运行它,而不必开始处理。但是它只有在启动该方法后才能运行。
将作业提交给执行者服务后,是否有任何方法可以执行?