Spring batch 弹簧批式多工序重载,每道工序下多线程

Spring 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")

我有一个场景,我需要大约50-60个不同的进程并发运行并执行一个任务

每个进程都必须使用sql查询从数据库中获取数据,方法是传递一个值并获取要在后续任务中运行的数据。 从表_1中选择列_1、列_2、列_3,其中列_1=:进程_1

 @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运行的重载应用程序,每个进程都需要并发运行,其中每个线程都应该能够支持进程内的多个线程

有没有一种方法可以监控这些进程,这样它就可以被终止,无论如何,我应该能够重新启动那个特定的进程?
请帮助解决这个问题。

请找到上述问题的答案

  • 并行处理—本地和远程分区支持并行处理,可以处理大量卷,因为我们目前每天处理2亿到3亿个数据

  • 是的,它可以处理大量的数据,并且已经得到了很好的验证

  • 每个进程都需要并发运行,其中每个线程都应该能够支持进程内的多个线程——Spring批处理将根据您的线程池进行处理。确保根据系统资源配置池

  • 是否有一种方法可以监控这些进程,从而终止它-是的。分区的每个并行进程都是一个步骤,您可以监视批处理中的步骤执行,并了解所有细节

  • 应该能够重新启动该特定进程-是的,这是一个内置功能,并从失败的步骤重新启动。大量的工作我们总是使用容错,这样拒绝将在以后处理。这也是内置的功能

  • 下面是一个示例项目

    添加了数据库-H2并在资源文件夹中创建可用的表。我们总是喜欢使用数据源池,池大小将大于线程池大小

    示例项目摘要

  • 从表“customer”中读取并划分为步骤分区
  • 每个步骤分区写入新表“new_customer”
  • 线程池配置在JobConfiguration.java方法名称“taskExecutor()中可用
  • slaveStep()中提供的块大小
  • 您可以根据并行步骤计算内存大小,并将其配置为VM max memory
  • 查询帮助您在执行后根据上述问题进行分析

    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个线程并行运行。