只有一半的MongoDB数据库在Spring批处理中处理

Lab*_*abe 5 java mysql mongodb spring-batch spring-boot

我有一个Spring Boot批处理使用MongoDB数据库来提供MySQL数据库.我的大约一半的数据库由程序处理,但在我的日志中只有200个错误.

BATCH_STEP_EXECUTION表让我知道该过程进展顺利(状态已完成)并显示READ_COUNT5692,尽管我在数据库中有11800个文档.

我是否忘记了配置中的某些内容以防止不通过整个数据库?

这是我的配置类:

@Configuration
@EnableBatchProcessing
@Import(PersistenceConfig.class)
public class BatchConfiguration {
    @Autowired
    MongoTemplate mongoTemplate;

    @Autowired
    SessionFactory sessionFactory;

    @Bean
    @StepScope
    public ItemReader<CourseData> reader() {
        MongoItemReader<CourseData> mongoItemReader = new MongoItemReader<>();
        mongoItemReader.setTemplate(mongoTemplate);
        mongoItemReader.setCollection("foo");
        mongoItemReader.setQuery("{}");
        mongoItemReader.setTargetType(CourseData.class);
        Map<String, Sort.Direction> sort = new HashMap<>();
        sort.put("_id", Sort.Direction.ASC);
        mongoItemReader.setSort(sort);

        return mongoItemReader;
    }

    @Bean
    public ItemProcessor<CourseData, MatrixOne> processor() {
        return new CourseDataMatrixOneProcessor();
    }

    @Bean
    public ItemWriter<MatrixOne> writer() {
        HibernateItemWriter writer = new HibernateItemWriter();
        writer.setSessionFactory(sessionFactory);
        System.out.println("writing stuff");
        return writer;
    }

    @Bean
    public Job importUserJob(JobBuilderFactory jobs, Step s1) {
        return jobs.get("importRawCourseJob")
                .incrementer(new RunIdIncrementer())
                .flow(s1)
                .end()
                .build();
    }

    @Bean
    @Transactional
    public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<CourseData> reader, ItemWriter<MatrixOne> writer, ItemProcessor<CourseData, MatrixOne> processor) {
        return stepBuilderFactory.get("step1")
                .<CourseData, MatrixOne>chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

Lab*_*abe 1

好的,今天当数据出现问题时,我通过在转换器中返回一个空的 POJO 而不是 null 来解决这个问题。然后我就在处理器中跳过它。

有点奇怪的是,它并没有在遇到第一个 null 时停止。也许块元素的一些并行化使我错误地读取了日志