【问题标题】:In Spring Batch, can I insert data in a beforeStep implementation在 Spring Batch 中,我可以在 beforeStep 实现中插入数据吗
【发布时间】:2017-06-19 13:32:59
【问题描述】:

我需要在步骤开始之前和完成时更新我的​​数据库。目的是在数据库中跟踪任何时候正在运行的进程。在步骤运行之前,它会插入一条记录;该步骤完成后,它将删除记录。不优雅,但这是我的要求。

我的想法是将其实现为 StepExecutionListener,在 beforeStep 和 afterStep 中发出插入和删除语句。这也将允许我利用为 Job 定义的 DataSource。

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

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    一般来说,您所描述的应该是可能的。您唯一需要注意的是事务控制,因为 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 中插入的条目。

    我不明白的是,为什么您必须实际向数据库中写入一个条目才能检查它是否可用。一个简单的选择还不够吗?

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

    【讨论】:

    • 感谢您的意见。在 beforeStep 中插入记录是关于状态管理的,而不是验证数据库是否可用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 2019-10-22
      • 2023-01-13
      • 2011-12-30
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多