/** * Pull a Tasklet out of a step. * @param step a TaskletStep * @return the Tasklet */ private Tasklet getTasklet(TaskletStep step) { return (Tasklet) getField(step, "tasklet"); }
Tasklet tasklet = getTasklet(step); Assert.state(tasklet instanceof ChunkOrientedTasklet<?>, "Tasklet must be ChunkOrientedTasklet in step=" + step.getName()); ChunkProcessor<T> chunkProcessor = getChunkProcessor((ChunkOrientedTasklet<?>) tasklet); Assert.state(chunkProcessor != null, "ChunkProcessor must be accessible in Tasklet in step=" + step.getName()); ItemWriter<T> itemWriter = getItemWriter(chunkProcessor); Assert.state(!(itemWriter instanceof ChunkMessageChannelItemWriter<?>), "Cannot adapt step [" + step.getName() + "] because it already has a remote chunk writer. Use a local writer in the step."); replaceChunkProcessor((ChunkOrientedTasklet<?>) tasklet, chunkWriter, stepContributionSource); if (chunkWriter instanceof StepExecutionListener) { step.registerStepExecutionListener((StepExecutionListener) chunkWriter); setNonBuffering(chunkProcessor); handler.setChunkProcessor(chunkProcessor);
@Bean public ChunkHandler chunkHandler(TaskletStep step1) throws Exception { RemoteChunkHandlerFactoryBean factoryBean = new RemoteChunkHandlerFactoryBean(); factoryBean.setChunkWriter(chunkWriter()); factoryBean.setStep(step1); return factoryBean.getObject(); }
/** * Replace the chunk processor in the tasklet provided with one that can act as a master in the Remote Chunking * pattern. * * @param tasklet a ChunkOrientedTasklet * @param chunkWriter an ItemWriter that can send the chunks to remote workers * @param stepContributionSource a StepContributionSource used to gather results from the workers */ private void replaceChunkProcessor(ChunkOrientedTasklet<?> tasklet, ItemWriter<T> chunkWriter, final StepContributionSource stepContributionSource) { setField(tasklet, "chunkProcessor", new SimpleChunkProcessor<T, T>(new PassThroughItemProcessor<>(), chunkWriter) { @Override protected void write(StepContribution contribution, Chunk<T> inputs, Chunk<T> outputs) throws Exception { doWrite(outputs.getItems()); // Do not update the step contribution until the chunks are // actually processed updateStepContribution(contribution, stepContributionSource); } }); }
/** * Pull out an item writer from a ChunkProcessor * @param chunkProcessor a ChunkProcessor * @return its ItemWriter */ @SuppressWarnings("unchecked") private ItemWriter<T> getItemWriter(ChunkProcessor<T> chunkProcessor) { return (ItemWriter<T>) getField(chunkProcessor, "itemWriter"); }
/** * Pull the ChunkProcessor out of a tasklet. * @param tasklet a ChunkOrientedTasklet * @return the ChunkProcessor */ @SuppressWarnings("unchecked") private ChunkProcessor<T> getChunkProcessor(ChunkOrientedTasklet<?> tasklet) { return (ChunkProcessor<T>) getField(tasklet, "chunkProcessor"); }