Spring 如何将数据传递到FlatFileItemWriter
我有一个批处理作业,它将从web服务调用,并将输入作业参数作为任何select查询。spring批处理作业然后使用JdbcCursorItemReader运行该查询,然后使用FlatFileItemWriter将数据写入CSV。我的问题是,我无法从读卡器中可用的元数据中将列名传递给编写器(同一步骤) 有什么建议吗?注意:我试图从编写器中构建和访问头字符串,但是bean初始化过程似乎期望头在那个时候准备好。因此,标题始终为空Spring 如何将数据传递到FlatFileItemWriter,spring,spring-batch,Spring,Spring Batch,我有一个批处理作业,它将从web服务调用,并将输入作业参数作为任何select查询。spring批处理作业然后使用JdbcCursorItemReader运行该查询,然后使用FlatFileItemWriter将数据写入CSV。我的问题是,我无法从读卡器中可用的元数据中将列名传递给编写器(同一步骤) 有什么建议吗?注意:我试图从编写器中构建和访问头字符串,但是bean初始化过程似乎期望头在那个时候准备好。因此,标题始终为空 @Bean @StepScope public JdbcCursorIt
@Bean
@StepScope
public JdbcCursorItemReader<Map<String, ?>> getRowsOfDataForExportFromTable(){
JdbcCursorItemReader<Map<String, ? extends Object>> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setDataSource(jdbcTemplate.getDataSource());
databaseReader.setSql("select * from SOME_TABLE where last_updated_date < DATE_SUB(NOW(), INTERVAL 10 DAY);");
databaseReader.setRowMapper(new RowMapper<Map<String, ? extends Object>>() {
@Override
public Map<String, ? extends Object> mapRow(ResultSet resultSet, int i) throws SQLException {
Map<String,String> resultMap = new LinkedHashMap<>();
int numOfColumns = resultSet.getMetaData().getColumnCount();
for (int j = 1; j < numOfColumns+1; j++){
String columnName = resultSet.getMetaData().getColumnName(j);
String value = resultSet.getString(j);
resultMap.put(columnName,value);
}
return resultMap;
}
});
return databaseReader;
}
@Bean
@StepScope
public FlatFileItemWriter<Map<String,Object>> saveDBRecordsToFileSystem(){
FlatFileItemWriter<Map<String,Object>> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource("/tmp/output.csv"));
DelimitedLineAggregator<Map<String,Object>> delLineAgg = new DelimitedLineAggregator<>();
delLineAgg.setDelimiter("\t");
writer.setHeaderCallback(new FlatFileHeaderCallback() {
public void writeHeader(Writer writer) throws IOException {
// need to get columnsFromDatabaseTable from ItemReader???
for (String header : columnsFromDatabaseTable) {
writer.write(header);
}
}
});
writer.setLineAggregator(delLineAgg);
return writer;
}
@Bean
@步进镜
公共JdbcCursorItemReader getRowsOfDataForExportFromTable(){
JdbcCursorItemReader databaseReader=新的JdbcCursorItemReader();
setDataSource(jdbcTemplate.getDataSource());
setSql(“从上次更新日期
@组件
@步进镜
公共类列名{
私有集列名称;
私有布尔不相容性;
public void setColumnNames(设置columnNames){
this.columnNames=columnNames;
isSetOnce=true;
}
公共集getColumnNames(){
返回列名称;
}
公共布尔isSetOnce(){
回程终止;
}
}
@豆子
@步进镜
公共JdbcCursorItemReader getRowsOfDataForExportFromTable(ColumnNames ColumnNames){
JdbcCursorItemReader databaseReader=新的JdbcCursorItemReader();
setDataSource(jdbcTemplate.getDataSource());
setSql(“从上次更新日期
这是如何做到的?我正在从我的ItemReader返回一张地图,这里的参考资料如何可用?一些代码可能会有帮助。与我的读者一起更新问题。
@Component
@StepScope
public class ColumnNames {
private Set<String> columnNames;
private boolean isSetOnce;
public void setColumnNames(Set<String> columnNames) {
this.columnNames = columnNames;
isSetOnce = true;
}
public Set<String> getColumnNames() {
return columnNames;
}
public boolean isSetOnce() {
return isSetOnce;
}
}
@Bean
@StepScope
public JdbcCursorItemReader<Map<String, ?>> getRowsOfDataForExportFromTable(ColumnNames columnNames) {
JdbcCursorItemReader<Map<String, ? extends Object>> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setDataSource(jdbcTemplate.getDataSource());
databaseReader.setSql("select * from SOME_TABLE where last_updated_date < DATE_SUB(NOW(), INTERVAL 10 DAY);");
databaseReader.setRowMapper(new RowMapper<Map<String, ? extends Object>>() {
@Override
public Map<String, ? extends Object> mapRow(ResultSet resultSet, int i) throws SQLException {
Map<String, String> resultMap = new LinkedHashMap<>();
int numOfColumns = resultSet.getMetaData().getColumnCount();
for (int j = 1; j < numOfColumns + 1; j++) {
String columnName = resultSet.getMetaData().getColumnName(j);
String value = resultSet.getString(j);
resultMap.put(columnName, value);
}
if (columnNames.isSetOnce()) {
columnNames.setColumnNames(resultMap.keySet());
}
return resultMap;
}
});
return databaseReader;
}
@Bean
@StepScope
public FlatFileItemWriter<Map<String, Object>> saveDBRecordsToFileSystem(ColumnNames columnNames) {
FlatFileItemWriter<Map<String, Object>> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource("tmp/output.csv"));
DelimitedLineAggregator<Map<String, Object>> delLineAgg = new DelimitedLineAggregator<>();
delLineAgg.setDelimiter("\t");
writer.setHeaderCallback(new FlatFileHeaderCallback() {
public void writeHeader(Writer writer) throws IOException {
for (String header : columnNames.getColumnNames()) {
writer.write(header);
}
}
});
writer.setLineAggregator(delLineAgg);
return writer;
}