我有一个 spring 批处理作业配置在 spring Web服务中运行 . 这项工作有几个步骤 . 我已经在不同的tomcats中部署了这个web服务的两个实例(但是这两个实例都使用相同的mysql数据库) .
我想在两个tomcats(每个一个)中同时运行一个具有不同参数的 spring 批处理作业 . 我没有使用分区,每个工作的参数完全不同 .
我在其中一只雄猫中开始工作,一切看起来都很好 . 但是当我在第二个tomcat中开始第二个作业时,作业被创建但它没有启动,甚至没有执行第一步的第一行od代码 .
我不是使用 spring 批的专家,所以也许我做错了 . 但是如果spring批处理作业在两个单独的tomcat实例中运行,它们应该并行运行吗?
这是工作配置:
<?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,jobParameters);
作业参数具有某些参数,这些参数在两个作业之间是唯一的,例如日期,我要上传的元素的名称 .
作业存储库和启动程序以下一种方式配置:
/ **
*工作存储库 .
- @return作业存储库 .
- @throws在无法创建作业存储库的情况下出现异常 .
- /
@ beans
public JobRepository jobRepository()抛出Exception {
JobRepositoryFactoryBean jobRepositoryFactory = new JobRepositoryFactoryBean();
jobRepositoryFactory.setDataSource(this.persistenceConfig.dataSource());
jobRepositoryFactory.setTransactionManager(this.persistenceConfig.transactionManager());
jobRepositoryFactory.setIsolationLevelForCreate( “ISOLATION_DEFAULT”);
return jobRepositoryFactory.getJobRepository();
}
/ **
*工作 Launcher .
*
- @return工作启动器 .
- @throws异常,以防无法创建作业启动器 .
- /
@ beans
public JobLauncher jobLauncher()抛出异常{
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(this.jobRepository());
jobLauncher.setTaskExecutor(this.taskExecutor());
return jobLauncher;
}
/ **
*任务执行者 .
*
- @return任务执行者 .
- /
@ beans
public TaskExecutor taskExecutor(){
SimpleAsyncTaskExecutor ex = new SimpleAsyncTaskExecutor();
ex.setConcurrencyLimit(1);
返回;
}
UPDATE: 我想到的一个解决方案是使用另一个名称"uploadProjectDataJobNormal2"创建第二个作业声明 . 这会有帮助吗?
1 回答
最后解决方案比预期的简单 . 在作业启动器中将并发更改为2:
我相信,如果Spring批处理作业在不同的JVM中运行,那将不会影响,但确实如此 .