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 无法识别

Spring boot spring.batch.job.enabled=false 无法识别

无法打开spring-batch-core