Реализация блокировки ключа раздела AWS DynamoDB на Java

Я запускаю одно и то же приложение с двумя разными портами в моем локальном компьютере. Код, который я предоставил, предназначен только для тестирования. Здесь access_key и secret_key будут предоставлены из переменных среды на более позднем этапе.

Когда я запускаю одно и то же приложение в разных портах, я вижу, что оба могут получить блокировку в ключе раздела Dynamodb.

Это совершенно новое для меня. Пожалуйста, нужна ваша поддержка, если мне нужно создать какой-либо механизм блокировки в AWS DynamoDB из консоли AWS.

Ниже приведены снимок таблицы DynamoDB консоли AWS и фрагмент кода, в котором я могу просмотреть журнал: «Приобретенная блокировка! Если я умру, срок действия моей блокировки истечет через 10 секунд». исходит от обоих запущенных экземпляров. В соответствии с моим требованием, если я блокирую один экземпляр, другой экземпляр не должен получать блокировку, где он должен предоставить журнал «Не удалось получить блокировку!».

Также я получаю сообщение об ошибке при выполнении кода в Spring Boot. AmazonDynamoDBLockClient: поток Heartbeat получил прерывание, выход из 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.");
    }
}

comment
Нашли ответ?   -  person Shivansh Jagga    schedule 05.02.2021
comment
Да. Это сработало для меня, и я поставил ответ ниже.   -  person Arindam    schedule 08.02.2021


Ответы (1)


Нужно получить блокировку (client.getLock(key, Optional.empty())) при условии, и у меня это сработало.

if (lockItem.isPresent()) {
            client.getLock("key", Optional.empty());
            logger.info("Acquired lock! If I die, my lock will expire in " + leaseDuration + " seconds.");
            logger.info("Otherwise, I will hold it until I stop heartbeating.");
            isDynamoDBLockAccessed = true;
} else {
            logger.info("Failed to acquire lock!");
            isDynamoDBLockAccessed = false;
}
person Arindam    schedule 08.02.2021