Spring Batch темы с использованием разделителя - PullRequest
0 голосов
/ 16 января 2020

Я пишу весеннее пакетное приложение, в котором нужно использовать потоки. Я использую разделитель. Все логики c, DAO и сущности находятся во внешнем банке.

В любом случае, мой вопрос ... Я делю свое приложение на 10 потоков. Когда я смотрю в БД таблицу BATCH_STEP_EXECUTION, там есть все мои разделители, но они не записаны одновременно. Я не знаю, правильно ли это.

это мой пакетный конфиг

@Bean
    public Job incomingJob() {
        return jobBuilderFactory.get("JOB_CONCEDER_PERFIL_NORMAL")
                .incrementer(new RunIdIncrementer())
                .start(partitionerStep()).build();
    }

    @Bean
    public Step partitionerStep() {
        return stepBuilderFactory.get("PARTITIONER_STEP")
                .partitioner("slaveStep", partitioner())
                .step(stepConcederPerfilNormal()).gridSize(10)
                .taskExecutor(taskExecutor())
                .build();
    }

    @Bean
    public Step stepConcederPerfilNormal() {
        return stepBuilderFactory.get("STEP_CONCEDER_PERFIL").<PerfilProcessorVO, PerfilConcessaoNormalVO>chunk(500)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .faultTolerant()
                .skip(NonUniqueObjectException.class)
                .skipLimit(1000)
                .noRollback(NonUniqueObjectException.class)
                .build();
    }

    @Bean
    public PerfilPartitioner partitioner() {
        return new PerfilPartitioner();
    }

    @Bean
    @StepScope
    public PerfilReader reader() {
        return new PerfilReader();
    }

    @Bean
    @StepScope
    public PerfilProcessor processor() {
        return new PerfilProcessor();
    }

    @Bean
    @StepScope
    public PerfilWriter writer() {
        return new PerfilWriter();
    }

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(20);
        executor.setCorePoolSize(10);
        executor.setAllowCoreThreadTimeOut(true);
        executor.setAwaitTerminationSeconds(100);
        return executor;
    }

Что я видел, так это то, что каждый поток просто обновляет таблицу только тогда, когда последний завершает sh.

ID  VERSION STEP_NAME                                   JOB_EXECUTION_ID    START_TIME                  END_TIME            STATUS      COMMIT  READ    FILT    write
1   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER6    0                   16/01/20 14:29:51,137000000                     STARTED     0       0       0       0   
2   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER8    0                   16/01/20 14:29:51,138000000                     STARTED     0       0       0       0   
3   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER5    0                   16/01/20 14:29:51,136000000                     STARTED     0       0       0       0   
4   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER4    0                   16/01/20 14:29:51,135000000                     STARTED     0       0       0       0   
5   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER1    0                   16/01/20 14:29:51,138000000                     STARTED     0       0       0       0   
6   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER2    0                   16/01/20 14:29:51,136000000                     STARTED     0       0       0       0   
7   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER3    0                   16/01/20 14:29:51,136000000                     STARTED     0       0       0       0   
8   3       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER7    0                   16/01/20 14:29:51,139000000 16/01/20 14:34:33   COMPLETED   1       16      0       16  
9   1       STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER9    0                   16/01/20 14:29:51,141000000                     STARTED     0       0       0       0   
10  15      STEP_CONCEDER_PERFIL:PERFIL_PARTITIONER0    0                   16/01/20 14:29:51,135000000                     STARTED     14      16      0       8   
0   1       PARTITIONER_STEP                            0                   16/01/20 14:29:43,813000000                     STARTED     0       0       0       0   

1 Ответ

0 голосов
/ 17 января 2020

В вашем Task Executor установите лимит одновременности

@Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(20);
        executor.setCorePoolSize(10);
        executor.setAllowCoreThreadTimeOut(true);
        executor.setAwaitTerminationSeconds(100);
executor.setConcurrencyLimit(n)
        return executor;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...