首页 > 解决方案 > Java - Cron 作业 - 如果一个实例触发批处理作业,则阻止其他实例执行相同操作

问题描述

我有一个在两个实例上运行的应用程序,实例之间的唯一通信是它们在单个数据库上运行。我有几个批处理作业在上面运行。例如:将记录从数据库复制到文件并将文件传送到服务器。由于这两个实例都有一个公共数据库,因此我正在尝试写入已触发作业的表。基本上,触发条件是给定表上不存在这样的记录。如何以原子方式执行此操作,即检查未触发作业的表然后插入表中?

标签: javaspringmultithreadingjpaatomic

解决方案


悲观锁定在这里可以提供帮助:

  • 创建一个保存锁定记录的专用表,最后执行时间
  • 在计划的执行中,获取(或创建)一个注入的锁EntityManager记录LockModeType.PESSIMISTIC_WRITE
  • 检查锁定记录的执行时间:如果最近更新,则作业必须已经在另一个实例上运行
  • 否则,执行作业,之后更新锁记录上的最后执行时间。

有关选项的更多详细信息,请参阅锁定模式(Java EE 教程)

这种锁定机制的示例应用:Liquibase 的DATABASECHANGELOGLOCK表,记录在这里


推荐阅读