天天看點

spring-batch多線程開啟

通過之前的介紹,大姐對spring-batch有了一定的了解。但是當資料量達到十萬級時,我們發現之前的JOB運作時間還是比較長的。

spring-batch優化效率可以直接在step中打開spring的多線程,進行多線程運作。當打開多線程之後,十萬級的資料運作可以在秒級運作完畢。

打開多線程分兩步,1.關閉讀取中的狀态記錄        2.開啟spring的多線程        代碼如下

@Bean("userReader")
    public FlatFileItemReader<User> userReader(){
        ClassPathResource classPathResource = new ClassPathResource("text/user.txt");
        FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
        flatFileItemReader.setResource(classPathResource);
        //設定跳過行數
        flatFileItemReader.setLinesToSkip(1);
        //資料轉換
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        tokenizer.setNames(new String[]{"userId","userName"});
        DefaultLineMapper<User> defaultLineMapper = new DefaultLineMapper<>();
        defaultLineMapper.setLineTokenizer(tokenizer);
        defaultLineMapper.setFieldSetMapper(fieldSet -> {
            User user = new User();
            user.setUserId(fieldSet.readString("userId"));
            user.setUserName(fieldSet.readString("userName"));
            return user;
        });
        defaultLineMapper.afterPropertiesSet();
        //關閉狀态記錄
        flatFileItemReader.setSaveState(false);
        flatFileItemReader.setLineMapper(defaultLineMapper);
        return flatFileItemReader;
    }
           
@StepScope
    @Bean
    public Step userStep() {
        return stepBuilderFactory.get("userStep")
                .<User,User>chunk(2)
                .reader(userReader)
                .processor(userProcess)
                .writer(userWriter)
                //打開spring多線程
                .taskExecutor(new SimpleAsyncTaskExecutor())
                .build();
    }