使用不同的参数同时执行多个 spring 批处理作业
Execute multiple spring batch jobs concurrently with different parameters
我在 spring 网络服务中配置了一个 spring 批处理作业 运行。这项工作有几个步骤。我在不同的 tomcat 中部署了此 Web 服务的两个实例(但两个实例使用相同的 mysql 数据库)。
我想 运行 一个 spring 批处理作业同时在两个 tomcat 中(每个一个)使用不同的参数。我没有使用分区,每个作业的参数完全不同。
我在其中一个 tomcat 开始工作,一切看起来都很好。但是当我在第二个tomcat中启动第二个作业时,作业创建了但没有启动,甚至没有执行第一步的第一行od代码。
我不是使用 spring 批处理的专家,所以也许我做错了什么。但是如果 spring 批处理作业在两个单独的 tomcat 实例中 运行ning,它们应该 运行 并行 no?
这是作业配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
<job id="uploadProjectDataJobNormal " xmlns="http://www.springframework.org/schema/batch">
<step id="setupProject" next="loadReferenceBuilds">
<tasklet ref="projectSetupTasklet"/>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="loadReferenceBuilds" next="snpToMorph">
<tasklet>
<chunk reader="faiReader" processor="faiProcessor" writer="faiWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="snpToMorph" next="indelToMorph">
<tasklet>
<chunk reader="snpReader" processor="snpProcessor" writer="snpWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="indelToMorph">
<tasklet>
<chunk reader="indelReader" processor="indelProcessor" writer="indelWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<listeners>
<listener ref="snpAwareBatchJobListener"/>
</listeners>
</job>
我是这样开始工作的:
this.jobLauncher.run(this.uploadProjectDataJobNormal, 作业参数);
作业参数具有某些参数,这些参数在两个作业之间是唯一的,例如日期、我要上传的元素的名称。
作业存储库和启动器的配置方式如下:
/**
* Job repository.
*
* @return the job repository.
* @throws Exception in case the job repository could not be created.
*/
@Bean
public JobRepository jobRepository() throws Exception {
JobRepositoryFactoryBean jobRepositoryFactory = new JobRepositoryFactoryBean();
jobRepositoryFactory.setDataSource(this.persistenceConfig.dataSource());
jobRepositoryFactory.setTransactionManager(this.persistenceConfig.transactionManager());
jobRepositoryFactory.setIsolationLevelForCreate("ISOLATION_DEFAULT");
return jobRepositoryFactory.getJobRepository();
}
/**
* Job launcher.
*
* @return the job launcher.
* @throws Exception in case the job launcher could not be created.
*/
@Bean
public JobLauncher jobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(this.jobRepository());
jobLauncher.setTaskExecutor(this.taskExecutor());
return jobLauncher;
}
/**
* Task executor.
*
* @return the task executor.
*/
@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor ex = new SimpleAsyncTaskExecutor();
ex.setConcurrencyLimit(1);
return ex;
}
更新: 我想到的一个解决方案是使用另一个名称创建第二个工作声明,例如 "uploadProjectDataJobNormal2"。这会有帮助吗?
最终解决方案比预期的要简单。在作业启动器中将并发更改为 2:
ex.setConcurrencyLimit(2);
我认为如果 spring 批处理作业在不同的 JVM 中 运行 不会影响,但它会影响。
我在 spring 网络服务中配置了一个 spring 批处理作业 运行。这项工作有几个步骤。我在不同的 tomcat 中部署了此 Web 服务的两个实例(但两个实例使用相同的 mysql 数据库)。
我想 运行 一个 spring 批处理作业同时在两个 tomcat 中(每个一个)使用不同的参数。我没有使用分区,每个作业的参数完全不同。
我在其中一个 tomcat 开始工作,一切看起来都很好。但是当我在第二个tomcat中启动第二个作业时,作业创建了但没有启动,甚至没有执行第一步的第一行od代码。
我不是使用 spring 批处理的专家,所以也许我做错了什么。但是如果 spring 批处理作业在两个单独的 tomcat 实例中 运行ning,它们应该 运行 并行 no?
这是作业配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
<job id="uploadProjectDataJobNormal " xmlns="http://www.springframework.org/schema/batch">
<step id="setupProject" next="loadReferenceBuilds">
<tasklet ref="projectSetupTasklet"/>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="loadReferenceBuilds" next="snpToMorph">
<tasklet>
<chunk reader="faiReader" processor="faiProcessor" writer="faiWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="snpToMorph" next="indelToMorph">
<tasklet>
<chunk reader="snpReader" processor="snpProcessor" writer="snpWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<step id="indelToMorph">
<tasklet>
<chunk reader="indelReader" processor="indelProcessor" writer="indelWriter" commit-interval="100"/>
</tasklet>
<listeners>
<listener ref="promotionListener"/>
<listener ref="snpAwareStepListener"/>
<listener ref="snpAwareItemReadListener"/>
</listeners>
</step>
<listeners>
<listener ref="snpAwareBatchJobListener"/>
</listeners>
</job>
我是这样开始工作的:
this.jobLauncher.run(this.uploadProjectDataJobNormal, 作业参数);
作业参数具有某些参数,这些参数在两个作业之间是唯一的,例如日期、我要上传的元素的名称。
作业存储库和启动器的配置方式如下:
/** * Job repository. * * @return the job repository. * @throws Exception in case the job repository could not be created. */ @Bean public JobRepository jobRepository() throws Exception { JobRepositoryFactoryBean jobRepositoryFactory = new JobRepositoryFactoryBean(); jobRepositoryFactory.setDataSource(this.persistenceConfig.dataSource()); jobRepositoryFactory.setTransactionManager(this.persistenceConfig.transactionManager()); jobRepositoryFactory.setIsolationLevelForCreate("ISOLATION_DEFAULT"); return jobRepositoryFactory.getJobRepository(); } /** * Job launcher. * * @return the job launcher. * @throws Exception in case the job launcher could not be created. */ @Bean public JobLauncher jobLauncher() throws Exception { SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); jobLauncher.setJobRepository(this.jobRepository()); jobLauncher.setTaskExecutor(this.taskExecutor()); return jobLauncher; } /** * Task executor. * * @return the task executor. */ @Bean public TaskExecutor taskExecutor() { SimpleAsyncTaskExecutor ex = new SimpleAsyncTaskExecutor(); ex.setConcurrencyLimit(1); return ex; }
更新: 我想到的一个解决方案是使用另一个名称创建第二个工作声明,例如 "uploadProjectDataJobNormal2"。这会有帮助吗?
最终解决方案比预期的要简单。在作业启动器中将并发更改为 2:
ex.setConcurrencyLimit(2);
我认为如果 spring 批处理作业在不同的 JVM 中 运行 不会影响,但它会影响。