当前位置: 首页 > 知识库问答 >
问题:

如何将数据传入FlatFileItemWriter

唐裕
2023-03-14

我有一个批处理作业,它将从web服务调用,输入作业参数作为任何select查询。spring批处理作业然后使用JdbcCursorItemReader运行该查询,然后使用FlatFileItemWriter将数据写入CSV。我的问题是我无法将列名从读取器中可用的元数据转移到编写器(相同的步骤)。

对如何做到这一点有什么建议吗?注意:我试图从writer获得构建和访问的头字符串,但bean初始化过程似乎期望头在那时就绪。因此,头总是空的。

@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;
}

共有1个答案

冷善
2023-03-14
@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;
}
 类似资料:
  • 问题内容: 我是Elasticearch的新手,并且已经尝试了2天,将一些数据插入Elasticearch。我在Google上发现有很多页面可以帮助创建索引(我不清楚“ index”,换句话说是“插入”吗?)然后很多地方给出了curl命令,但我确实没有知道在哪里执行这些代码行以插入数据。例: 我正在使用Window 7,并且已安装Java并成功运行elasticsearch。任何人都可以向我展示有

  • 问题内容: 我想在我的MySQL数据库中插入整数188和90,但以下代码不起作用: 为什么不起作用? 问题答案: 编辑 为我工作: 在MySQL表;

  • 问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态

  • null 非常感谢任何指向文档或非常基本的示例的指针。

  • 我创建了一个新的电子应用程序。 在索引中。jsi使用节点文件系统加载数据 如果我试着使用require。JSIT之所以能够工作,是因为它运行在不同的线程上,而不是使用节点进行初始化,更像是一个实际的浏览器窗口。但有没有办法从索引中传递数据呢。js到main。js 我不知道我对这个问题的看法是否部分正确 如果您需要更多代码或信息,请询问!

  • 很新的反应。。。 我试图循环我的this.props.children,以便向他们传递一个在我的父项中定义的字符串。。。在没有在render方法中定义这些子对象的情况下,这是可能的吗? OwnRenderer应该将道具字符串传递给它的所有子级。。。OwnRenderer不知道要渲染哪个孩子,因此无法通过“”直接传递道具。。。 我试着绕过孩子们直接传递那根绳子,但不幸的是,这不起作用。 不知怎的,它