Я использую одно и то же приложение с двумя разными портами в моем локальном компьютере. Код, который я предоставил, предназначен только для тестирования. Здесь access_key и secret_key будут предоставлены из переменных среды на более позднем этапе.
Когда я запускаю одно и то же приложение в разных портах, я вижу, что оба могут получить блокировку в ключе раздела dynamicodb.
Это абсолютно новое для меня. Вам нужна ваша поддержка, нужно ли мне сделать какой-либо механизм блокировки в AWS DynamoDB из AWS Консоли.
Ниже приведен снимок таблицы AWS консоли DynamoDB и фрагмент кода, где я могу увидеть журнал: " Полученная блокировка! Если я ie, моя блокировка истечет через 10 секунд. " исходит от обоих работающих экземпляров. Согласно моему требованию, если я блокирую из одного экземпляра, другой экземпляр не должен получить блокировку, где он должен предоставить журнал «Не удалось получить блокировку!».
Также я получаю ошибку во время выполнение кода в Spring Boot. AmazonDynamoDBLockClient: поток пульса получил прерывание, выход из run () (возможно, выход из потока)
@Component
public class AwsDynamoDBConfiguration {
Logger logger = LoggerFactory.getLogger(AwsDynamoDBConfiguration.class);
/**
* AWS configuration.
*/
@Autowired
private AwsConfiguration awsConfiguration;
private static final AwsClientBuilder.EndpointConfiguration DYNAMODB_ENDPOINT = new AwsClientBuilder.EndpointConfiguration(
"https://dynamodb.us-east-1.amazonaws.com", "us-east-1");
private Optional<LockItem> lockItem;
private AmazonDynamoDBLockClient client;
public boolean lockDynamoDB() throws InterruptedException, IOException {
logger.info("Start : AWS DynamoDB lockDynamoDB");
boolean isDynamoDBLockAccessed = false;
final AmazonDynamoDB dynamoDB = AmazonDynamoDBClientBuilder.standard()
.withEndpointConfiguration(DYNAMODB_ENDPOINT)
.withCredentials(new AWSStaticCredentialsProvider(
new BasicAWSCredentials("access_key", "secret_key")))
.build();
logger.info("DynamoDB created.");
// Whether or not to create a heartbeating background thread
final boolean createHeartbeatBackgroundThread = true;
// build the lock client
client = new AmazonDynamoDBLockClient(AmazonDynamoDBLockClientOptions.builder(dynamoDB, "tbl_test_lock")
.withTimeUnit(TimeUnit.SECONDS).withLeaseDuration(100L).withHeartbeatPeriod(3L)
.withCreateHeartbeatBackgroundThread(createHeartbeatBackgroundThread).build());
logger.info("DynamoDB Client created.");
// try to acquire a lock on the partition key "key"
lockItem = client.tryAcquireLock(AcquireLockOptions.builder("key").build());
logger.info("DynamoDB try acquire lock.");
if (lockItem.isPresent()) {
logger.info("Acquired lock! If I die, my lock will expire in 10 seconds.");
logger.info("Otherwise, I will hold it until I stop heartbeating.");
isDynamoDBLockAccessed = true;
} else {
logger.info("Failed to acquire lock!");
isDynamoDBLockAccessed = false;
}
client.close();
logger.info("End : AWS DynamoDB lockDynamoDB");
return isDynamoDBLockAccessed;
}
@PreDestroy
public void destroy() {
logger.info("AWS DynamoDB Callback triggered - @PreDestroy.");
if (client != null && lockItem != null && lockItem.isPresent()) {
client.releaseLock(lockItem.get());
}
logger.info("AWS DynamoDB Lock has been released.");
}
}