1

我正在研究一种将使用 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 列表仅处理一次

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

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

我想做这样的事情,

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

}

但我只是不知道如何传递myListmyIndexItemReader.

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

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

4

2 回答 2

1

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

于 2013-10-21T13:51:50.867 回答
0

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

查询.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(作为第一步),您可以处理作业参数并List<>使用 REST 创建。
作业参数可使用 spEL 查看关于late-binding

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

于 2013-09-07T10:33:52.697 回答