我需要在Step启动之前和完成之后更新我的数据库。目的是在数据库中跟踪哪些进程在任何时间运行。在步骤运行之前,它将插入记录;在步骤完成后,它将删除记录。不优雅,但这是我的要求。
我的想法是将它作为StepExecutionListener实现,在beforeStep和afterStep中发出insert和delete语句。这也可以让我利用为Job定义的DataSource。
这种方法的缺点是什么?框架中是否还有其他钩子可以更好地解决这个问题?
答案 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,为删除添加一个