Может ли главный шаг действовать как ведомый после отправки сообщений разделения при использовании MessageChannelPartitionHandler - PullRequest
0 голосов
/ 03 января 2019

Я создал небольшое Proof of Concept (POC), используя Spring Batch, который использует MessageChannelPartitionHandler. Идея состоит в том, чтобы развернуть код на нескольких узлах в производстве. Мой вопрос заключается в том, может ли главный узел выполнять работу подчиненного устройства, помимо отправки сообщений разделения подчиненным, используя промежуточное программное обеспечение для обмена сообщениями, такое как ActiveMQ. Мастер ограничен только отправкой сообщений?

 @Bean
public Step masterStep() throws Exception {

    return stepBuilderFactory.get("masterStep")
            .partitioner(slaveStep().getName(), partitioner())
            .step(slaveStep())
            .partitionHandler(partitionHandler(null))
            .taskExecutor(taskExecutor())
            .gridSize(GRID_SIZE)               
            .build();
}

@Bean
public Step slaveStep() {

    return stepBuilderFactory.get("slaveStep")
            .<WorkItem, ReportData>chunk(CHUNK_SIZE)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
}

@Bean
@Profile("master")
public Job processingBatchJob() throws Exception {

    return 
   jobBuilderFactory.get("processingBatchJob").listener(jobListener)
            .start(masterStep())
            .build();
}

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setMaxPoolSize(20);
    taskExecutor.setCorePoolSize(20);
    taskExecutor.setQueueCapacity(100);
    taskExecutor.afterPropertiesSet();
    taskExecutor.setThreadNamePrefix("xtrac");
    return taskExecutor;
}    

@Bean
public PartitionHandler partitionHandler(MessagingTemplate 
messagingTemplate) throws Exception
{
    MessageChannelPartitionHandler partitionHandler = new 
     MessageChannelPartitionHandler();
    partitionHandler.setStepName("slaveStep");
    partitionHandler.setGridSize(GRID_SIZE);
    partitionHandler.setMessagingOperations(this.messageTemplate);
    partitionHandler.setPollInterval(5000l);
    partitionHandler.setJobExplorer(this.jobExplorer);
    partitionHandler.afterPropertiesSet();
    return partitionHandler;
}

1 Ответ

0 голосов
/ 03 января 2019

Да, мастер может выступать в качестве рабочего в настройке удаленного разделения и не ограничивается только отправкой сообщений и агрегированием результатов от рабочих. Я бы даже порекомендовал сделать это так, чтобы ресурсы на главном узле не были потрачены впустую в ожидании, когда работники закончат свою работу.

...