在Spring批处理中添加多个更新查询JdbcBatchItemWriter

时间:2018-05-03 07:04:59

标签: java spring-batch

我需要根据我在文件中收到的数据在两个表上运行更新。源是一个文件。

我尝试使用多个查询搜索JdbcBatchItemWriter。

目前我尝试了下面的方法,有1个工作和2个步骤 - 在这两个步骤中使用相同的阅读器,相同的处理器和相同的监听器 - 但我认为它是重复的。

<batch:job id="batchJob">

    <batch:step id="step1" next="step2">
        <batch:tasklet>

            <batch:chunk reader="cvsFileItemReader" processor="myItemProcessor"
                writer="mysqlItemWriter1" commit-interval="1" skip-limit="10">
                <batch:listeners>
                    <batch:listener ref="stepListener">
                    </batch:listener>
                </batch:listeners>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

    <batch:step id="step2">
        <batch:tasklet>
            <batch:chunk reader="cvsFileItemReader" processor="myItemProcessor"
                writer="mysqlItemWriter2" commit-interval="1" skip-limit="10">
                <batch:listeners>
                    <batch:listener ref="stepListener">
                    </batch:listener>
                </batch:listeners>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

</batch:job>

我的itemWriter1和2运行更新,我需要获取两个查询的更新计数。

这只是我找不到的工作,但我觉得这还不够理想

如果我们可以在一个单独的编写器中使用多个更新查询,请告诉我。还建议是否有任何最佳方式。

谢谢

1 个答案:

答案 0 :(得分:1)

你可以解决装饰JdbcBatchItemWriter的问题:这个装饰者负责在ExecutionContext中存储真正的作家真正写的多少项目,这样你就可以在后面的步骤中回来。

class CountingItemWriter implements ItemStreamWriter {
  private JdbcBatchItemWriter delegate;
  private int count = 0;
  private final String id;

  CountingItemWriter(String id) {
    this.id = "CountingItemWriter#"+id;
  }

  write(List<?> items) {
    delegate.write(items);
    count += items.size();
  }

  open(ExecutionContext ec) {
    count = getInt(this.id, 0);
  }

  update(ExecutionContext ec) {
    ec.putInt(this.id, count);
  }

  close() {
    // no-op
  }
}

如果您有多位作家可以为每位作家检索正确的计数器,请记得给出不同的id