自定义项目读取器,使用 JdbcPagingItemReader?

huangapple go评论85阅读模式
英文:

Custom Item Reader that uses JdbcPagingItemReader?

问题

以下是您要翻译的内容:

我可以在批处理配置中找到以下代码段时从我的数据库中读取数据:

  1. @Bean
  2. public ItemReader<? extends Orders> reader() {
  3. JdbcPagingItemReader<Orders> reader = new JdbcPagingItemReader<>();
  4. final SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
  5. sqlPagingQueryProviderFactoryBean.setDataSource(dataSource);
  6. sqlPagingQueryProviderFactoryBean.setSelectClause("select *");
  7. sqlPagingQueryProviderFactoryBean.setFromClause("from orders");
  8. sqlPagingQueryProviderFactoryBean.setWhereClause(
  9. "where order_status=var1 and date < var2");
  10. sqlPagingQueryProviderFactoryBean.setSortKey("date");
  11. try {
  12. reader.setQueryProvider(sqlPagingQueryProviderFactoryBean.getObject());
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. reader.setDataSource(dataSource);
  17. reader.setPageSize(3);
  18. reader.setRowMapper(new BeanPropertyRowMapper<Orders>(Orders.class));
  19. return reader;
  20. }

然而,我无法从我的Restful API 动态地将变量传递给此 ItemReader。根据我所了解,我应该创建一个自定义的 ItemReader,但我不确定如何利用 JdbcPagingItemReader 来创建它。是否有人能帮我解决这个问题?谢谢!

  1. public void orderProcess(String var1) {
  2. taskExecutor.execute(new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. JobParameters jobParameters = new JobParametersBuilder()
  7. .addString("var1", var1)
  8. .addString("var", "sampleValue1")
  9. .addString("time",
  10. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S")
  11. .format(Calendar.getInstance().getTime()))
  12. .addDate("date", new Date()).toJobParameters();
  13. jobLauncher.run(job, jobParameters);
  14. } catch (Exception e) {
  15. LogUtil.logError(LOGGER, "ERROR IN STARTING JOB", e);
  16. }
  17. }
  18. });
  19. }
英文:

I am able to read from my db when this code snippet is in my batchConfig

  1. @Bean
  2. public ItemReader&lt;? extends Orders&gt; reader() {
  3. JdbcPagingItemReader&lt;Orders&gt; reader = new JdbcPagingItemReader&lt;Orders&gt;();
  4. final SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
  5. sqlPagingQueryProviderFactoryBean.setDataSource(dataSource);
  6. sqlPagingQueryProviderFactoryBean.setSelectClause(&quot;select *&quot;);
  7. sqlPagingQueryProviderFactoryBean.setFromClause(&quot;from orders&quot;);
  8. sqlPagingQueryProviderFactoryBean.setWhereClause(
  9. &quot;where order_status=var1 and date &lt; var2&quot;);
  10. sqlPagingQueryProviderFactoryBean.setSortKey(&quot;date&quot;);
  11. try {
  12. reader.setQueryProvider(sqlPagingQueryProviderFactoryBean.getObject());
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. reader.setDataSource(dataSource);
  17. reader.setPageSize(3);
  18. reader.setRowMapper(new BeanPropertyRowMapper&lt;Orders&gt;(Orders.class));
  19. return reader;
  20. }

However, I am not able to pass variables to this ItemReader dynamically from my Restful API. From what I read, I should create a custom item reader however I am not sure how to create that leveraging JdbcPagingItemReader.

Would any of you help me on this one? Thanks!

  1. public void orderProcess(String var1) {
  2. taskExecutor.execute(new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. JobParameters jobParameters = new JobParametersBuilder()
  7. .addString(&quot;var1&quot;, var1)
  8. .addString(&quot;var&quot;, &quot;sampleValue1&quot;)
  9. .addString(&quot;time&quot;,
  10. new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss.S&quot;)
  11. .format(Calendar.getInstance().getTime()))
  12. .addDate(&quot;date&quot;, new Date()).toJobParameters();
  13. jobLauncher.run(job, jobParameters);
  14. } catch (Exception e) {
  15. LogUtil.logError(LOGGER, &quot;ERROR IN STARTING JOB&quot;, e);
  16. }
  17. }
  18. });
  19. }

答案1

得分: 0

在这种情况下,您应该将您的项目读取器(Item Reader)设置为步骤范围(step-scoped),以便动态地将作业参数注入其配置中。以下是一个示例:

  1. @Bean
  2. public ItemReader<? extends Orders> reader(
  3. @Value("#{jobParameters['var1']}") String var1,
  4. @Value("#{jobParameters['var2']}") String var2) {
  5. JdbcPagingItemReader<Orders> reader = new JdbcPagingItemReader<Orders>();
  6. final SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
  7. sqlPagingQueryProviderFactoryBean.setDataSource(dataSource);
  8. sqlPagingQueryProviderFactoryBean.setSelectClause("select *");
  9. sqlPagingQueryProviderFactoryBean.setFromClause("from orders");
  10. sqlPagingQueryProviderFactoryBean.setWhereClause(
  11. "where order_status=" + var1 + " and date < " + var2);
  12. sqlPagingQueryProviderFactoryBean.setSortKey("date");
  13. try {
  14. reader.setQueryProvider(sqlPagingQueryProviderFactoryBean.getObject());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. reader.setDataSource(dataSource);
  19. reader.setPageSize(3);
  20. reader.setRowMapper(new BeanPropertyRowMapper<Orders>(Orders.class));
  21. return reader;
  22. }

您可以在参考文档中找到更多详细信息:作业和步骤属性的后期绑定

英文:

> Hi @MahmoudBenHassine, i want to pass it using job parameters, i added in the question

In that case, you should make your item reader step-scoped in order to inject job parameters in its configuration dynamically. Here is an example:

  1. @Bean
  2. public ItemReader&lt;? extends Orders&gt; reader(
  3. @Value(&quot;#{jobParameters[&#39;var1&#39;]}&quot;) String var1,
  4. @Value(&quot;#{jobParameters[&#39;var2&#39;]}&quot;) String var2) {
  5. JdbcPagingItemReader&lt;Orders&gt; reader = new JdbcPagingItemReader&lt;Orders&gt;();
  6. final SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
  7. sqlPagingQueryProviderFactoryBean.setDataSource(dataSource);
  8. sqlPagingQueryProviderFactoryBean.setSelectClause(&quot;select *&quot;);
  9. sqlPagingQueryProviderFactoryBean.setFromClause(&quot;from orders&quot;);
  10. sqlPagingQueryProviderFactoryBean.setWhereClause(
  11. &quot;where order_status=&quot; + var1 + &quot; and date &lt; &quot; + var2);
  12. sqlPagingQueryProviderFactoryBean.setSortKey(&quot;date&quot;);
  13. try {
  14. reader.setQueryProvider(sqlPagingQueryProviderFactoryBean.getObject());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. reader.setDataSource(dataSource);
  19. reader.setPageSize(3);
  20. reader.setRowMapper(new BeanPropertyRowMapper&lt;Orders&gt;(Orders.class));
  21. return reader;
  22. }

You can find more details in the reference documentation here: Late Binding of Job and Step Attributes

huangapple
  • 本文由 发表于 2023年5月25日 16:26:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/76330271.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定