我正在研究一种使用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
答案 0 :(得分:1)
我采用了另一种方法,并根据REST标准将信息存储在数据库表中。然后ItemReader
读取表并在每次运行后清除它。
答案 1 :(得分:0)
您可以将查询作为作业参数传递,但必须小心,因为字符串作业参数具有有限的长度(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<>
。
使用spEL查看有关late-binding的作业参数。
我希望我很清楚,英语不是我的母语。