Я создал небольшое 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;
}