Spring Batch 无法通过 DB (postgres) 获取作业锁
Posted
技术标签:
【中文标题】Spring Batch 无法通过 DB (postgres) 获取作业锁【英文标题】:Spring Batch can not obtain job lock via DB (postgres) 【发布时间】:2021-08-17 16:51:40 【问题描述】:我有几个“编排器”微服务实例,它们在不同的节点上运行并执行 Spring Batch 作业。只有一个实例必须是“活动的”并且一次执行该工作。通过带有 cron 表达式的 @Scheduled
注释每天安排两次作业。
因此,mocriservice 尝试使用单个标识 JobParameter
执行作业,该标识 LocalDateTime.now()
被截断为秒,以补偿我的实例运行的 OpenShift 节点之间的时间差异。
底层数据库是 Postgres 12,其事务隔离级别设置为可重复读取。
这个问题对我来说似乎无法解决,但它总是发生并重现。 每个微服务实例上的作业执行失败,复合 PK 上的 DuplicateKeyException
是(并不奇怪)作业名称和标识参数的哈希值。
问题是这怎么可能,我错过了什么?有什么想法吗?
【问题讨论】:
这到底是什么时候发生的?请分享您的代码并显示错误何时能够有效地帮助您。 【参考方案1】:抱歉这么晚才回复。完全没有问题,无论事务隔离级别如何,锁都能正常工作。我们有两个 OpenShift 集群 - 活动的和非活动的。作业在“非活动”节点上运行,这些节点之所以被调用,是因为没有客户端流量路由到它们。事实证明,生产支持无法访问“非活动”节点日志:)
【讨论】:
以上是关于Spring Batch 无法通过 DB (postgres) 获取作业锁的主要内容,如果未能解决你的问题,请参考以下文章
带有 JobParameters 的 Spring Batch SQL 命令
用于分布式 DB2 数据库的 Spring Batch Reader
从DB2获取数据并使用没有元数据表的Spring Batch保存在MongoDB中
Spring boot spring.batch.job.enabled=false 无法识别