在Spring Batch中,我可以在beforeStep实现中插入数据吗?

时间:2017-06-17 02:38:33

标签: spring-batch

我需要在Step启动之前和完成之后更新我的数据库。目的是在数据库中跟踪哪些进程在任何时间运行。在步骤运行之前,它将插入记录;在步骤完成后,它将删除记录。不优雅,但这是我的要求。

我的想法是将它作为StepExecutionListener实现,在beforeStep和afterStep中发出insert和delete语句。这也可以让我利用为Job定义的DataSource。

这种方法的缺点是什么?框架中是否还有其他钩子可以更好地解决这个问题?

2 个答案:

答案 0 :(得分:0)

通常,您所描述的内容应该是可能的。您唯一需要注意的是事务控制,因为beforeStep和afterStep在“正常”事务处理之外。 (这里有3篇好帖子,详细解释了交易处理 https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-2-restart-cursor-based-reading-and-listeners/https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/

您还可以使用单独的步骤(作为简单的Tasklet-Step实现),而不是使用before- / afterStep侦听器。 Step1在数据库中插入一个条目或抛出异常,导致批处理失败或只是结束它(取决于您的流程定义),step2执行正常逻辑,步骤3删除您在步骤1中插入的​​条目。

我不明白的是,为什么你必须在数据库中写入一个条目以检查它是否可用。一个简单的选择不足以满足要求吗?

如果我必须这样做,我将通过两个步骤实现您的要求,第一步通过执行简单选择来检查可用性,第二步执行正常逻辑。

答案 1 :(得分:0)

你是对的,你需要实现StepExecutionListener。我认为这种方法没有任何缺点。或者,您可以为插入添加两个不同的tasklet,为删除添加一个