【发布时间】:2022-01-23 14:28:16
【问题描述】:
我已经编写了一个用于写入平面文件的复合项目编写器,但如果满足某些条件,我也想在数据库中写入。那么,我该怎么做……我是初学者。请帮忙..
复合文件写入器类:
@Component("CompositeFileWriter")
公共类 ChargeBackCompositeFileWriter 实现 ItemStreamWriter{
@Autowired
private PartOrderDao partOrderDao;
@Autowired
@Qualifier("errorFileWriter")
private ItemStreamWriter<ChargeBack> errorFileWriter;
@Autowired
@Qualifier("retryFileWriter")
private ItemStreamWriter<ChargeBack> retryFileWriter;
@Autowired
@Qualifier("processedFileWriter")
private ItemStreamWriter<ChargeBack> processedFileWriter;
@Override
public void write(List<? extends ChargeBack> items) throws Exception {
List<ChargeBack> errorRecords = items.stream().filter(ChargeBack::isBadRecord).collect(Collectors.toList());
List<ChargeBack> retryRecords = items.stream().filter(ChargeBack::isRetryRecord)
.collect(Collectors.toList());
List<ChargeBack> processedRecords = items.stream()
.filter(chargeBack -> !chargeBack.isBadRecord())
.filter(chargeBack-> !chargeBack.isRetryRecord())
.collect(Collectors.toList());
//ChargeBack chargeBack = new ChargeBack();
if (CollectionUtils.isNotEmpty(errorRecords)) {
errorFileWriter.write(errorRecords);
}
if (CollectionUtils.isNotEmpty(processedRecords)) {
processedFileWriter.write(processedRecords);
}
if (CollectionUtils.isNotEmpty(retryRecords)) {
}
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
errorFileWriter.open(executionContext);
processedFileWriter.open(executionContext);
//retryFileWriter.open(executionContext);
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
errorFileWriter.update(executionContext);
processedFileWriter.update(executionContext);
//retryFileWriter.update(executionContext);
}
@Override
public void close() throws ItemStreamException {
errorFileWriter.close();
processedFileWriter.close();
//retryFileWriter.close();
}
}
批处理配置文件
@Bean
public ItemStreamWriter<ChargeBack> processedFileWriter(
@Value("${processed.file}") FileSystemResource processedFile) {
FlatFileItemWriter<ChargeBack> writer = new FlatFileItemWriter<>();
writer.setResource(processedFile);
writer.setLineAggregator(new DelimitedLineAggregator<ChargeBack>() {
{
setDelimiter("|");
setFieldExtractor(new BeanWrapperFieldExtractor<ChargeBack>() {
{
setNames(new String[] { ""
});
}
});
}
});
return writer;
}
//for reading retry file and passing it, for writing record to the table.
@Bean
@StepScope
public FlatFileItemReader retryFileReader(@Value("${input.retryFile}") FileSystemResource inputFile){
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(inputFile);
reader.setLinesToSkip(0);
reader.setStrict(false);
reader.setLineMapper(new DefaultLineMapper(){
{setFieldSetMapper(new BeanWrapperFieldSetMapper(){{
setTargetType(ChargeBack.class);}});
setLineTokenizer(new DelimitedLineTokenizer(){{
setNames(new String[]{""});
setDelimiter("|");}});}});
return reader;
}
@Bean
public JdbcBatchItemWriter retryFileWriterToDB(){
JdbcBatchItemWriter writer = new JdbcBatchItemWriter ();
writer.setDataSource(pdccRepositoryConfig.pdccDataSource());
writer.setSql(")" +
" values (?, ?, ?, ? , ?, ?, ? , ?, ?, ? , ?, ?, ?, ?, ? ) ");
writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<ChargeBack>() {
@Override
public void setValues(ChargeBack item, PreparedStatement ps) throws SQLException {
ps.setString(1, item.getAccertifyCBControlNumber().toString());
ps.setString(2,item.getInternalComment2());
ps.setString(3, item.getDisputeType());
ps.setString(4, item.getBrand());
ps.setString(5,item.getResolution1ts());
ps.setString(6, item.getReasonCode());
ps.setString(7, item.getReasonDescription());
ps.setString(8,item.getWonLossStatus());
ps.setString(9, item.getDisputedDate());
ps.setString(10, Double.toString(item.getDisputedAmount()));
ps.setString(11, item.getReportingGroup());
ps.setString(12, item.getDueDate());
ps.setString(13,item.getLocation());
ps.setString(14, item.getResolution1ts());
ps.setString(15, item.getTransactionDate());
}
});
return writer;
}
我目前正在使用上面的 jdbcbatchitemwriter 在数据库中单独编写,但我希望它被 streamitemwriter 使用,这样我就可以同时编写,而不是单独编写。 我的问题是我想使用这个 jdbcbatchitemwriter 供 streamitemwriter 使用,就像上面我使用平面文件项目编写器一样。 如果我不能在 streamwriter 中使用 jdbcbatchitemwriter 那么下一个解决方案是什么。如果可能,请详细说明..
【问题讨论】:
标签: java spring spring-boot spring-batch