Spring integration JDBC锁注册表访问JVMS

Spring integration JDBC锁注册表访问JVMS,spring-integration,Spring Integration,我的应用程序服务使用JDBC LockRepository获取锁是否应该在@Transaction内运行 我们有一个更新JDBCRepository的示例应用程序服务,因为这个应用程序可以在多个JVM上运行(headless)。我们需要一个全局锁来序列化这些更新 我看了你的测试,希望我的用例也能起作用 我的配置有一个DefaultLockRepository和JdbcLockRegistry 我在两个终端上启动(java-jarboot.jar)我的应用程序来模拟。当我获得一个锁并在我的应用程序

我的应用程序服务使用JDBC LockRepository获取锁是否应该在@Transaction内运行

我们有一个更新JDBCRepository的示例应用程序服务,因为这个应用程序可以在多个JVM上运行(headless)。我们需要一个全局锁来序列化这些更新

我看了你的测试,希望我的用例也能起作用

我的配置有一个DefaultLockRepository和JdbcLockRegistry

我在两个终端上启动(java-jarboot.jar)我的应用程序来模拟。当我获得一个锁并在我的应用程序服务上发出一个不带@Transaction的tryLock()时,他们两人几乎立即一个接一个地获得锁。我希望他们中的一个至少在10秒钟内(默认有效期)得不到它

它按预期工作

我很确定我错过了什么?但我希望我的锁操作在解锁或过期之前遵守全局锁(即JDBC存储中存在一个过期的锁)


我的理解不正确吗?

您必须使用不同的ID。相同的is意味着相同的客户机。对于特殊的用例。使用不同的ID,因为它们是不同的实例

您必须使用不同的ID。相同的is意味着相同的客户机。对于特殊的用例。使用不同的ID,因为它们是不同的实例

这按设计工作。我没有正确配置DefaultLockRepository,默认ttl比我的服务(人工等待)锁定持续时间短。我的道歉。:)Josh Long帮我弄明白了这一点:)

这是设计好的。我没有正确配置DefaultLockRepository,默认ttl比我的服务(人工等待)锁定持续时间短。我的道歉。:)Josh Long帮我弄明白了这一点:)

你是说同一个锁密钥的
INT\u LOCK
中有两条记录吗?因为我的测试涉及在两个终端上运行相同的应用程序(模拟多JVM集群),我怀疑INT\u LOCK中只有一行(因为我使用的是相同的锁密钥、区域和id)。我运行了一个测试,并意识到我不会看到任何行,因为在app context.close()中有一个deleteall。我添加了代码,以便在获得锁之后和解锁之前获取INT_锁的内容。我注意到创建的timestamp列(只有一行)的值已更改(另一个线程重写了该行)。我的服务中没有@Transaction。你是说同一个锁密钥的
INT\u LOCK
中有两条记录吗?因为我的测试涉及在两个终端上运行相同的应用程序(模拟多JVM集群),我怀疑INT\u LOCK中只有一行(因为我使用的是相同的锁密钥、区域和id)。我运行了一个测试,并意识到我不会看到任何行,因为在app context.close()中有一个deleteall。我添加了代码,以便在获得锁之后和解锁之前获取INT_锁的内容。我注意到创建的timestamp列(只有一行)的值已更改(另一个线程重写了该行)。我的服务中没有@Transaction。我从这个开始(让它使用默认的客户端id),我应该提到它;很抱歉我还应该提到,当我将@Transaction添加到我的服务中时,它的工作原理与我预期的一样(锁定行在持续时间内被锁定)。Client-1(实例)获取并进入睡眠状态30秒,然后释放。同时启动的Client-2能够获取相同的锁。我在DefaultLockRepository中也没有看到任何使其在“@Transaction”之外工作的查询。也许使用DefaultLockRepository的客户端应该总是启动一个事务?如果他们使用不同的
id
,他们就不能获得相同的锁,查询是基于
id
,并且
INT\u lock
表有一个
主键(lock\u key,REGION)
约束。我从这开始(让它使用默认的客户端id)我应该提到它;很抱歉我还应该提到,当我将@Transaction添加到我的服务中时,它的工作原理与我预期的一样(锁定行在持续时间内被锁定)。Client-1(实例)获取并进入睡眠状态30秒,然后释放。同时启动的Client-2能够获取相同的锁。我在DefaultLockRepository中也没有看到任何使其在“@Transaction”之外工作的查询。也许使用DefaultLockRepository的客户端应该总是启动一个事务?如果他们使用不同的
id
,他们就不能获得相同的锁,查询基于
id
,并且
INT\u lock
表具有
主键(lock\u key,REGION)
约束。
Service (Instance -1) {
  Obtain("KEY-1")
  tryLock()
  DoWork()
  unlock();
  close();
 }
Service (Instance -2) {
 Obtain("KEY-1")
 tryLock() <-- Wait until the lock expires or the unlock happens
 DoWork()
 unlock();
close();
 }
 @Transaction
    Service (Instance -1) {
      Obtain("KEY-1")
      tryLock()
      DoWork()
      unlock();
      close();
     }