如何为Spring Batch项目阅读器添加参数?

时间:2018-12-25 23:45:44

标签: java spring postgresql spring-batch

我觉得这是一件非常基本的事情,但是我找不到有关该操作方法的文档。我发现的所有文档/示例均假设静态查询。我可以将其作为静态查询来执行,但是我想知道如何使用变量。 我正在尝试将Spring Batch与Postgres一起使用。

我想要做的是这样的查询:

SELECT * from SOME_TABLE WHERE SOURCE = ? AND (EXPIRES BETWEEN ? AND ?)

我尝试了各种写查询的方式,例如用:source之类的变量替换问号。我什至不确定我使用的是正确的ItemReader类还是需要编写自己的类。这是我的配置:

@Bean
protected JdbcPagingItemReader<JpaEntitlement> itemReader(DataSource dataSource)
        throws Exception {
    JdbcPagingItemReader<JpaEntitlement> pagingItemReader = new JdbcPagingItemReader<>();
    pagingItemReader.setDataSource(dataSource);
    pagingItemReader.setPageSize(1);

    PagingQueryProvider pagingQueryProvider = createQueryProvider(dataSource);
    pagingItemReader.setQueryProvider(pagingQueryProvider);
    pagingItemReader.setRowMapper(new BeanPropertyRowMapper<>(JpaClass.class));
    return pagingItemReader;
}

private PagingQueryProvider createQueryProvider(DataSource dataSource) throws Exception {
    SqlPagingQueryProviderFactoryBean pagingQueryProvider =
            new SqlPagingQueryProviderFactoryBean();
    pagingQueryProvider.setSelectClause("*");
    pagingQueryProvider.setFromClause("FROM SOME_TABLE");
    pagingQueryProvider.setWhereClause("WHERE SOURCE = ? AND (EXPIRES between ? AND ?)");
    pagingQueryProvider.setDataSource(dataSource);
    return pagingQueryProvider.getObject();
}

我猜最终的问题是:Spring Batch是否包含某些功能?如果没有,我应该重写什么以添加此功能?

要添加的内容是需要分批处理的内容,因为它可能会成千上万条记录。

2 个答案:

答案 0 :(得分:0)

如果您知道批处理开始时的参数,则将参数作为Jobparamters传递。现在,您可以使用@ StepScope访问Reader中的Jobparamters。 以下是用于在阅读器中访问作业参数的示例代码

@Bean
protected JdbcPagingItemReader<JpaEntitlement> itemReader(@Value("#{jobParameters['someparameter']}") String someparameter DataSource dataSource)
        throws Exception {
    JdbcPagingItemReader<JpaEntitlement> pagingItemReader = new JdbcPagingItemReader<>();
    pagingItemReader.setDataSource(dataSource);
    pagingItemReader.setPageSize(1);

    PagingQueryProvider pagingQueryProvider = createQueryProvider(dataSource);
    pagingItemReader.setQueryProvider(pagingQueryProvider);
    pagingItemReader.setRowMapper(new BeanPropertyRowMapper<>(JpaClass.class));
    return pagingItemReader;
}

希望这会有所帮助

这类似于此question

答案 1 :(得分:0)

  

我觉得这是一件非常基本的事情,但是我找不到有关该操作方法的文档。

参考文档中的相关部分是Late Binding of Job and Step Attributes,其中提供了有关如何使用JobScopeStepScope的代码示例。这个想法是,您可以在最近的运行时(而不是在配置时急于)从作业参数或作业/步骤执行上下文中将查询属性动态绑定到读取器中。

希望这会有所帮助。