Spring batch 弹簧批式多工序重载,每道工序下多线程
我有一个场景,我需要大约50-60个不同的进程并发运行并执行一个任务 每个进程都必须使用sql查询从数据库中获取数据,方法是传递一个值并获取要在后续任务中运行的数据。 从表_1中选择列_1、列_2、列_3,其中列_1=:进程_1Spring batch 弹簧批式多工序重载,每道工序下多线程,spring-batch,spring-batch-tasklet,spring-batch-job-monitoring,spring-batch-stream,Spring Batch,Spring Batch Tasklet,Spring Batch Job Monitoring,Spring Batch Stream,我有一个场景,我需要大约50-60个不同的进程并发运行并执行一个任务 每个进程都必须使用sql查询从数据库中获取数据,方法是传递一个值并获取要在后续任务中运行的数据。 从表_1中选择列_1、列_2、列_3,其中列_1=:进程_1 @Bean public Job partitioningJob() throws Exception { return jobBuilderFactory.get("parallelJob")
@Bean
public Job partitioningJob() throws Exception {
return jobBuilderFactory.get("parallelJob")
.incrementer(new RunIdIncrementer())
.flow(masterStep())
.end()
.build();
}
@Bean
public Step masterStep() throws Exception {
//How to fetch data from configuration and pass all values in partitioner one by one.
// Can we give the name for every process so that it is helpful in logs and monitoring.
return stepBuilderFactory.get("masterStep")
.partitioner(slaveStep())
.partitioner("partition", partitioner())
.gridSize(10)
.taskExecutor(new SimpleAsyncTaskExecutor())
.build();
}
@Bean
public Partitioner partitioner() throws Exception {
//Hit DB with sql query and fetch the data.
}
@Bean
public Step slaveStep() throws Exception {
return stepBuilderFactory.get("slaveStep")
.<Map<String, String>, Map<String, String>>chunk(1)
.processTask()
.build();
}
@Bean
公共作业分区作业()引发异常{
返回jobBuilderFactory.get(“parallelJob”)
.incrementer(新的RunIdIncrementer())
.flow(masterStep())
(完)
.build();
}
@豆子
公共步骤masterStep()引发异常{
//如何从配置中获取数据并逐个传递分区器中的所有值。
//我们是否可以为每个进程命名,以便它有助于日志和监视。
return stepBuilderFactory.get(“masterStep”)
.partitioner(slaveStep())
.partitioner(“partition”,partitioner())
.gridSize(10)
.taskExecutor(新的SimpleAsyncTaskExecutor())
.build();
}
@豆子
public Partitioner Partitioner()引发异常{
//使用sql查询点击DB并获取数据。
}
@豆子
公共步骤slaveStep()引发异常{
返回stepBuilderFactory.get(“slaveStep”)
.chunk(1)
.processTask()
.build();
}
正如我们在ApacheCamel中使用聚合器和并行处理一样,SpringBatch是否有类似的功能来完成相同的工作
我是SpringBatch的新手,目前正在探索它是否能够处理这个数量。
因为这将是一个24*7运行的重载应用程序,每个进程都需要并发运行,其中每个线程都应该能够支持进程内的多个线程
有没有一种方法可以监控这些进程,这样它就可以被终止,无论如何,我应该能够重新启动那个特定的进程?
请帮助解决这个问题。请找到上述问题的答案
SELECT * FROM NEW_CUSTOMER;
SELECT * FROM BATCH_JOB_EXECUTION bje;
SELECT * FROM BATCH_STEP_EXECUTION bse WHERE JOB_EXECUTION_ID=2;
SELECT * FROM BATCH_STEP_EXECUTION_CONTEXT bsec WHERE STEP_EXECUTION_ID=4;
如果您想更改为MYSQL,请添加以下数据源
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.poolName=SpringBoot-HikariCP
spring.datasource.url=jdbc:mysql://localhost:3306/ngecomdev
spring.datasource.username=ngecom
spring.datasource.password=ngbilling
请始终参考下面的guthub URL。你会从中得到很多想法
感谢您对该工具的帮助和建立信心。在将数据从分区传递到步骤时,我面临一些问题。我需要在分区中执行一个查询,并根据该输出创建许多进程,这些进程中使用该输出。一个示例项目将非常有用。我将修改上述答案并添加一个示例项目感谢Rakesh链接。这对我很有帮助,因为我正在探索SpringBatch。不过,我有一个场景,我想听听你的意见。由于这些作业是基于cron的,这取决于我是否需要运行此应用程序的另一个实例的情况,那么如何确保它们不重复。@重写公共映射分区(int-threadCorePoolSize){List min=jdbcTemplate.queryForList(“从表中选择DISTINCT wo.col_name”,String.class);Map result=new HashMap();for(String site:min){ExecutionContext context=new ExecutionContext();context.putString(默认值_KEY_NAME,site);result.put(site,context);}返回结果;}。。。。。。。这是我的分区逻辑,因此我可以有一些40-50个线程并行运行。