Spring batch 用于读取for循环每次迭代的Custome ItemReader

Spring batch 用于读取for循环每次迭代的Custome ItemReader,spring-batch,Spring Batch,最近开始使用基于Spring批处理块的处理。我需要创建一个批来创建300万个随机字符串,每个字符串有100万个不同的类型和计数。就像一百万个以a开头的字符串,接下来150万个以GH结尾。无法使用for循环执行此操作,因为它将阻止线程。我也必须用db写。不知道如何让我的ItemReader读取每次迭代 我已经理解了定制的ItemReader 但是没有得到这里应该是“项目”的东西。 如果我创建一个1000的块,那么计数器将如何处理,计算块条目和字符串生成的计数器。ItemReader接口非常类似于迭

最近开始使用基于Spring批处理块的处理。我需要创建一个批来创建300万个随机字符串,每个字符串有100万个不同的类型和计数。就像一百万个以a开头的字符串,接下来150万个以GH结尾。无法使用for循环执行此操作,因为它将阻止线程。我也必须用db写。不知道如何让我的ItemReader读取每次迭代

我已经理解了定制的ItemReader 但是没有得到这里应该是“项目”的东西。
如果我创建一个1000的块,那么计数器将如何处理,计算块条目和字符串生成的计数器。

ItemReader接口非常类似于
迭代器,因此必须在内部保持迭代状态。Spring批处理框架甚至提供了一个
IteratorItemReader
。 由于Java8有流,我发现它在生成数据方面也非常通用,并且可以转换成
迭代器
。
以下是一个可能的解决方案,与您所描述的大致相同:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Java8StreamReaderTest.TestConfig.class, properties = {"spring.batch.job.enabled=false"})
@EnableBatchProcessing
public class Java8StreamReaderTest {

    @Configuration
    static class TestConfig {

        @Bean
        JobBuilderFactory jobBuilderFactory(final JobRepository jobRepository) {
            return new JobBuilderFactory(jobRepository);
        }

        @Bean
        StepBuilderFactory stepBuilderFactory(final JobRepository jobRepository, final PlatformTransactionManager transactionManager) {
            return new StepBuilderFactory(jobRepository, transactionManager);
        }

        @Bean
        Job streamJob() {
            return jobBuilderFactory(null).get("streamJob")
                    .start(stepBuilderFactory(null, null).get("streamStep")
                        .<String, String>chunk(1000)
                        .reader(streamReader())
                        .writer(listWriter())
                        .build()
                )
                .build();
        }

        @Bean
        ListItemWriter<String> listWriter() {
            return new ListItemWriter<>();
        }

        @Bean
        ItemReader<String> streamReader() {
            return new IteratorItemReader<String>(stream().iterator());
        }

        @Bean
        Stream<String> stream() {
            return Stream.of(
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String("A"+ RandomStringUtils.random(10, true, false));
                }),
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String("B"+ RandomStringUtils.random(10, true, false));
                }),
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String(RandomStringUtils.random(10, true, false) + "GH");
                })
            )
            .flatMap(s -> s);
        }
    }

    @Autowired
    Job streamJob;

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    ListItemWriter<String> listWriter;

    @Test
    public void shouldExecuteTestJob() throws Exception {
        JobExecution execution = jobLauncher.run(streamJob, new JobParametersBuilder().toJobParameters());
        assertEquals(ExitStatus.COMPLETED, execution.getExitStatus());
        assertThat(listWriter.getWrittenItems(), hasSize(300000));
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Java8StreamReaderTest.TestConfig.class,properties={“spring.batch.job.enabled=false”})
@启用批处理
公共类Java8StreamReaderTest{
@配置
静态类TestConfig{
@豆子
JobBuilderFactory JobBuilderFactory(最终JobRepository JobRepository){
返回新的JobBuilderFactory(jobRepository);
}
@豆子
StepBuilderFactory StepBuilderFactory(最终JobRepository JobRepository,最终平台transactionManager transactionManager){
返回新的StepBuilderFactory(jobRepository、transactionManager);
}
@豆子
作业流作业(){
返回jobBuilderFactory(null).get(“streamJob”)
.start(stepBuilderFactory(null,null).get(“streamStep”)
.chunk(1000)
.reader(streamReader())
.writer(listWriter())
.build()
)
.build();
}
@豆子
ListItemWriter listWriter(){
返回新的ListItemWriter();
}
@豆子
ItemReader streamReader(){
返回新的IteratorItemReader(stream().iterator());
}
@豆子
溪流{
回流(
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(“A”+RandomStringUtils.random(10,true,false));
}),
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(“B”+RandomStringUtils.random(10,true,false));
}),
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(RandomStringUtils.random(10,true,false)+“GH”);
})
)
.平面图(s->s);
}
}
@自动连线
工作流程;
@自动连线
JobLauncher JobLauncher;
@自动连线
ListItemWriter;
@试验
public void shouldExecuteTestJob()引发异常{
JobExecution execution=jobLauncher.run(streamJob,new JobParametersBuilder().toJobParameters());
assertEquals(ExitStatus.COMPLETED,execution.getExitStatus());
资产(listWriter.getWrittenItems(),hasSize(300000));
}
}

ItemReader
接口与迭代器非常相似,因此必须在内部维护迭代状态。Spring批处理框架甚至提供了一个
IteratorItemReader
。 由于Java8有流,我发现它在生成数据方面也非常通用,并且可以转换成
迭代器
。
以下是一个可能的解决方案,与您所描述的大致相同:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Java8StreamReaderTest.TestConfig.class, properties = {"spring.batch.job.enabled=false"})
@EnableBatchProcessing
public class Java8StreamReaderTest {

    @Configuration
    static class TestConfig {

        @Bean
        JobBuilderFactory jobBuilderFactory(final JobRepository jobRepository) {
            return new JobBuilderFactory(jobRepository);
        }

        @Bean
        StepBuilderFactory stepBuilderFactory(final JobRepository jobRepository, final PlatformTransactionManager transactionManager) {
            return new StepBuilderFactory(jobRepository, transactionManager);
        }

        @Bean
        Job streamJob() {
            return jobBuilderFactory(null).get("streamJob")
                    .start(stepBuilderFactory(null, null).get("streamStep")
                        .<String, String>chunk(1000)
                        .reader(streamReader())
                        .writer(listWriter())
                        .build()
                )
                .build();
        }

        @Bean
        ListItemWriter<String> listWriter() {
            return new ListItemWriter<>();
        }

        @Bean
        ItemReader<String> streamReader() {
            return new IteratorItemReader<String>(stream().iterator());
        }

        @Bean
        Stream<String> stream() {
            return Stream.of(
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String("A"+ RandomStringUtils.random(10, true, false));
                }),
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String("B"+ RandomStringUtils.random(10, true, false));
                }),
                IntStream.range(0, 100000).boxed().map(i -> {
                    return new String(RandomStringUtils.random(10, true, false) + "GH");
                })
            )
            .flatMap(s -> s);
        }
    }

    @Autowired
    Job streamJob;

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    ListItemWriter<String> listWriter;

    @Test
    public void shouldExecuteTestJob() throws Exception {
        JobExecution execution = jobLauncher.run(streamJob, new JobParametersBuilder().toJobParameters());
        assertEquals(ExitStatus.COMPLETED, execution.getExitStatus());
        assertThat(listWriter.getWrittenItems(), hasSize(300000));
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Java8StreamReaderTest.TestConfig.class,properties={“spring.batch.job.enabled=false”})
@启用批处理
公共类Java8StreamReaderTest{
@配置
静态类TestConfig{
@豆子
JobBuilderFactory JobBuilderFactory(最终JobRepository JobRepository){
返回新的JobBuilderFactory(jobRepository);
}
@豆子
StepBuilderFactory StepBuilderFactory(最终JobRepository JobRepository,最终平台transactionManager transactionManager){
返回新的StepBuilderFactory(jobRepository、transactionManager);
}
@豆子
作业流作业(){
返回jobBuilderFactory(null).get(“streamJob”)
.start(stepBuilderFactory(null,null).get(“streamStep”)
.chunk(1000)
.reader(streamReader())
.writer(listWriter())
.build()
)
.build();
}
@豆子
ListItemWriter listWriter(){
返回新的ListItemWriter();
}
@豆子
ItemReader streamReader(){
返回新的IteratorItemReader(stream().iterator());
}
@豆子
溪流{
回流(
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(“A”+RandomStringUtils.random(10,true,false));
}),
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(“B”+RandomStringUtils.random(10,true,false));
}),
IntStream.range(0,100000).boxed().map(i->{
返回新字符串(RandomStringUtils.random(10,true,false)+“GH”);
})
)
.平面图(s->s);
}
}
@自动连线
工作流程;
@自动连线
JobLauncher JobLauncher;
@自动连线
ListItemWriter;
@试验
公众的