我尝试使用 AmazonDynamoDBLockClient 获取锁定,DynamoDb 在本地主机上运行。 但我收到 NPE 说
Cannot invoke "software.amazon.awssdk.services.dynamodb.model.AttributeValue.s()" because "ownerName" is null
以下是项目结构
POM 中的依赖关系
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-lock-client</artifactId>
<version>1.2.0</version>
</dependency>
Bean 配置
@Bean
public DynamoDbClient dynamoDbClient(){
return DynamoDbClient.builder()
.endpointOverride(URI.create("http://localhost:8000"))
.build();
}
@Bean
public AmazonDynamoDBLockClient amazonDynamoDBLockClient(){
return new AmazonDynamoDBLockClient(AmazonDynamoDBLockClientOptions
.builder(dynamoDbClient(), "table-name")
.withPartitionKeyName("partition-key-name")
.withOwnerName("owner-name") // I have put "app" here
.withTimeUnit(TimeUnit.SECONDS)
.withLeaseDuration(10L)
.withHeartbeatPeriod(3L)
.withCreateHeartbeatBackgroundThread(true)
.build());
}
获取Lock方法
public Optional<LockItem> acquireLock(){
return amazonDynamoDBLockClient.tryAcquireLock(AcquireLockOptions.builder("partitionKey").build();
}
如果您对这个问题有任何见解,我将不胜感激。
问题在于您实际上需要在表中包含所有者名称和其他字段。您将必须实现领导者选举算法。您可以关注这篇文章的一些详细信息:https://adityajindal.org/leader-election-using-dynamo-db-lock-client-b1f257ff6a7f