【问题标题】:How to pass List to Spring Batch ItemReader via REST call如何通过 REST 调用将 List 传递给 Spring Batch ItemReader
【发布时间】:2013-09-11 01:28:00
【问题描述】:

我正在研究一种将使用 Spring Batch 执行工作的 REST 方法。

我定义了一个简单的工作,

<job id="myIndexJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1">
        <tasklet>
            <chunk reader="myIndexItemReader" processor="myIndexItemProcessor" writer="myIndexItemWriter" commit-interval="1" />
        </tasklet>
    </step>
</job>

这项工作模仿了我之前发布的一个问题,

Spring Batch ItemReader list processed only once

但这一次,我不想按计划执行作业,而是想通过 REST 调用手动执行它。

我遇到的问题是将List 传递给myIndexItemReader。我的 REST 调用将根据一些查询字符串生成一个List。每次执行步骤时,我发布的上一个问题都是通过 XML 中的 spring bean 传递给它的 List

我想做这样的事情,

@RequestMapping(value="/rest/{regex}", method=RequestMethod.GET)
public void run(@PathVariable String regex) {

    List<String> myList = new ArrayList<>();
    myList.add("something");

    long nanoBits = System.nanoTime() % 1000000L;
    if (nanoBits < 0) {
        nanoBits *= -1;
    }
    String dateParam = new Date().toString() + System.currentTimeMillis() 
            + "." + nanoBits;
    JobParameters param = new JobParametersBuilder()
            .addString("date", dateParam)
            .toJobParameters();
    JobExecution execution = jobLauncher.run(job, param);

}

但我只是不知道如何将myList 传递给myIndexItemReader

到目前为止,我可以通过创建 RepeatTemplate 并在回调中调用 iterate 来做到这一点,但工作 chunk 似乎更干净。

有人有什么想法或建议吗?谢谢/w

【问题讨论】:

  • 能否将查询字符串作为作业参数传递给批处理作业,然后让批处理作业阅读器使用查询来创建列表?
  • 求职电话之间的查询是否相同或可能不同?
  • @bellabax 它们可以相同也可以不同,但​​这种调用可能很少见。
  • @Freg 我没有考虑工作参数。读者容易理解吗?我还没有读过。

标签: java spring rest spring-batch


【解决方案1】:

您可以将查询作为作业参数传递,但您必须小心,因为字符串作业参数的长度是有限的 (250)(请看Metadata schema)。
如果这可能是一个限制,您可以像这样预编译属性文件:

queries.properties

query1=<query string 1>
query2=<query string 2>
query3=<query string 3>
queryn=<query string n>

作为作业参数你可以传递:

queriesIdsCount (integer): number of queries (0..n)
queryId0 (string): identifier of query in queries.properties file (ex: query2)
queryId1 (string): (ex. query3)
queryIdn (string): (ex. query1)

等等,以便您可以从列表中选择查询。
使用Tasklet 或通常的 Reader/Process/Writer(作为第一步),您可以处理作业参数并使用 REST 创建List&lt;&gt;
可使用 spEL 查看有关 late-binding 的作业参数。

我希望我清楚,英语不是我的母语。

【讨论】:

    【解决方案2】:

    我采用了另一种方法,并根据 REST 标准将信息存储在数据库表中。然后ItemReader 读取表并在每次运行后将其清除。

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2019-08-02
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2013-03-24
      • 2020-07-12
      • 2012-01-12
      • 2013-07-07
      相关资源
      最近更新 更多