[英]How to use composite file writer for jdbc or writing data to database?
我已經編寫了一個用於寫入平面文件的復合項目編寫器,但是如果滿足某些條件,我也想在數據庫中寫入。 那么,我該怎么做……我是初學者。 請幫助..
復合文件寫入器 class:
@Component("CompositeFileWriter")
公共 class 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 那么下一個解決方案是什么。 如果可能的話,請詳細說明..
因此,要將 JDBCitemwriter 與 Compositeitemwriter 一起使用,只需讓您的 JdbcitemWriter 返回類型為 itemwriter。
@Bean
public ItemWriter retryFileWriterToDB(){
JdbcBatchItemWriter writer = new JdbcBatchItemWriter ();
writer.setDataSource(pdccRepositoryConfig.pdccDataSource());
writer.setSql("insert into failed_forter_claim_api_order (accertify_cb_control_number, internal_comment2, dispute_type, brand, resolution1_name, reason_code, reason_description, won_loss_status, disputed_date, disputed_amount, reporting_group, due_date, location, resolution1_ts, transaction_date)" +
" 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;
}
@Component("CompositeFileWriter") public class ChargeBackCompositeFileWriter 實現 ItemStreamWriter{
@Autowired
private PartOrderDao partOrderDao;
@Autowired
@Qualifier("errorFileWriter")
private ItemStreamWriter<ChargeBack> errorFileWriter;
@Autowired
@Qualifier("retryFileWriterToDB")
private ItemWriter<ChargeBack> retryFileWriterToDB;
@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)) {
System.out.println("writing ti DB:..");
// System.out.println("Calling partdao.......");
//partOrderDao.insertFailedRecord(retryRecords);
retryFileWriterToDB.write(retryRecords);
}
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
errorFileWriter.open(executionContext);
processedFileWriter.open(executionContext);
//((ItemStream) retryFileWriter).open(executionContext);
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
errorFileWriter.update(executionContext);
processedFileWriter.update(executionContext);
//((ItemStream) retryFileWriter).update(executionContext);
}
@Override
public void close() throws ItemStreamException {
errorFileWriter.close();
processedFileWriter.close();
//((ItemStream) retryFileWriter).close();
}
}
Rest 所有代碼都相同,粘貼在問題中。 在 batchCONfig 文件中,我只是更改了 jdbcitemwriter 的返回類型,在 Compositewriter class 中我已經自動連接了這個 jdbcitemwriter,就像這樣@Autowired @Qualifier("retryFileWriterToDB") private ItemWriter<ChargeBack> retryFileWriterToDB;
並在復合作家 class 中使用它作為
retryFileWriterToDB.write(retryRecords);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.