Springboot Batch получает CSV от остальных API - PullRequest
0 голосов
/ 17 января 2020

У меня есть сценарий для пакетного приложения Springboot, где мне нужно прочитать CSV-11 и записать в другой CSV-2, проблема возникает, когда мне нужно получить CSV-1 из конечной точки REST, например, когда я инициирую задание должно получить CSV-1 из конечной точки, а затем продолжить пакетную обработку для записи в CSV-2. Но похоже, что для обработки CSV-1 нам нужно заранее подать «Ресурс» во время запуска приложения [я довольно новичок в пакетном режиме, поэтому не уверен, что это на 100% правильно]. Может кто-нибудь подсказать мне правильный подход к решению этой проблемы?

РЕДАКТИРОВАТЬ : добавив код, я смог решить его, но мне нужен совет, если это правильный способ сделать что-то (пожалуйста, игнорируйте жестко закодированные данные).

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobbuilder;

    @Autowired
    private StepBuilderFactory stepbuilder;

    @Autowired
    private CSVProcessor processor;

    @Autowired
    private CustomSkipPolicy customSkipPolicy;

    @Autowired
    private CSVResponse response;

    @Bean(name="csv")
    public Job job_csv() throws Exception {

        Step step = stepbuilder
                .get("csv-step")
                .<Person, Person>chunk(5)
                .reader(new CSVReader(response.getResource()))
                .processor(processor)
                .writer(new CSVWriter().write(response.getFilename()))
                .faultTolerant()
                .skipPolicy(customSkipPolicy)
                .listener(new StepListener())
                .build();

        return jobbuilder
                .get("csv-job")
                .incrementer(new RunIdIncrementer())
                .listener(new JobListener())
                .flow(step)
                .end()
                .build();

    }
}


@Slf4j
public class CSVReader extends FlatFileItemReader<Person> {

    public CSVReader(Resource resource) throws Exception {
        super();
        setResource(resource);
        setStrict(false);
        setLinesToSkip(1);

        doOpen();

        DelimitedLineTokenizer dlt = new DelimitedLineTokenizer();
        dlt.setNames(new String[] {"id","first_name","last_name","email","gender","ip_address","dob"});
        dlt.setDelimiter(",");
        dlt.setStrict(false);

        BeanWrapperFieldSetMapper<Person> fsp = new BeanWrapperFieldSetMapper<>();
        fsp.setTargetType(Person.class);

        DefaultLineMapper<Person> dlp = new DefaultLineMapper<>();
        dlp.setLineTokenizer(dlt);
        dlp.setFieldSetMapper(fsp);

        setLineMapper(dlp);
    }
}

public class CSVWriter {
    private static final String DATA_PROCESSED = "C:/data/processed";

    public FlatFileItemWriter<Person> write(String filename) throws Exception {
        FlatFileItemWriter<Person> writer = new FlatFileItemWriter<>();
        writer.setResource(resource(filename));
        writer.setHeaderCallback(new Header());

        BeanWrapperFieldExtractor<Person> fe = new BeanWrapperFieldExtractor<>();
        fe.setNames(new String[] { "id", "first_name", "last_name", "age" });

        DelimitedLineAggregator<Person> dla = new DelimitedLineAggregator<>();
        dla.setDelimiter(",");
        dla.setFieldExtractor(fe);

        writer.setLineAggregator(dla);
        return writer;
    }

    private Resource resource(String filename) throws IOException {
        String processed_file = filename.replace(".csv", "").concat("_PROCESSED").concat(".csv");
        if (Files.notExists(Paths.get(DATA_PROCESSED), new LinkOption[] { LinkOption.NOFOLLOW_LINKS })) {
            Files.createDirectory(Paths.get(DATA_PROCESSED));
        }
        if (Files.notExists(Paths.get(DATA_PROCESSED + "/" + processed_file),
                new LinkOption[] { LinkOption.NOFOLLOW_LINKS })) {
            Files.createFile(Paths.get(DATA_PROCESSED + "/" + processed_file));
        }
        return new FileSystemResource(DATA_PROCESSED + "/" + processed_file);
    }

}


@Component
@Slf4j
public class CSVResponse {

    private static final String DATA_RECEIVE = "C:/data/receive";
    private String filename;

    public Resource getResource() throws IOException {
        ResponseEntity<Resource> resp = new RestTemplate().getForEntity("http://localhost:8081/csv", Resource.class);
        log.info("File Received : "+resp.getBody().getFilename());
        setFilename(resp.getBody().getFilename());
        Path path = Paths.get(DATA_RECEIVE);
        if(!Files.exists(path, new LinkOption[]{ LinkOption.NOFOLLOW_LINKS})) {
            Files.createDirectory(path);
        }
        Files.copy(resp.getBody().getInputStream(), Paths.get(DATA_RECEIVE + "/" +resp.getBody().getFilename()), StandardCopyOption.REPLACE_EXISTING);
        return resp.getBody();
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

}

1 Ответ

0 голосов
/ 17 января 2020

Вы можете реализовать средство чтения элементов с помощью интерфейса StepExecutionListener , и вам необходимо реализовать извлечение файла CSV-1 с помощью RestTemplate в beforeStep () метода считыватель предметов.

Вы можете узнать, как использовать RestTemplate с https://www.baeldung.com/rest-template

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...