Повторяющиеся имена IdentityProperty не допускаются — S3ClientJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Повторяющиеся имена IdentityProperty не допускаются — S3Client

Сообщение Anonymous »

Я использую AWS Lambda, написанную на Java 21 с Spring Boot 3. Моя Lambda использует клиент S3, экземпляр которого я создаю следующим образом:

Код: Выделить всё

@Configuration
public class AwsConfig {

@Bean
public S3Client awsS3Client() {
return S3Client.builder()
.region(Region.US_WEST_2)
.build();
}
}
Проблема:

Когда я последовательно вызываю Lambda несколько раз, среда AWS создает новый S3Client до того, как предыдущий будет собран мусором. Это приводит к следующей ошибке:

Код: Выделить всё

No duplicate IdentityProperty names allowed but both IdentityProperties 7890fbf9 and 25f0f461 have the same namespace (java.lang.String) and name (Bucket). IdentityProperty should be referenced from a shared static constant to protect against erroneous or unexpected collisions.
Если я подожду 5–7 минут перед повторным запуском лямбды, все будет работать отлично!
При отладке я вижу, что это происходит из класса IdentityProperty AWS SDK, а именно:

Код: Выделить всё

private static final ConcurrentMap prev = NAME_HISTORY.putIfAbsent(Pair.of(namespace, name), this);
Validate.isTrue(prev == null,
"No duplicate IdentityProperty names allowed but both IdentityProperties %s and %s have the same "
+ "namespace (%s) and name (%s). IdentityProperty should be referenced from a shared static constant to "
+ "protect against erroneous or unexpected collisions.",
Integer.toHexString(System.identityHashCode(prev)),
Integer.toHexString(System.identityHashCode(this)),
namespace,
name);
}
Похоже, что после первого вызова Lambda NAME_HISTORY не очищается, поэтому последующие вызовы завершаются неудачно при попытке зарегистрировать тот же ключ «java.lang.String»/«Bucket».
Этот метод вызывается S3ExpressAuthSchemeProvider, который, в свою очередь, вызывается DefaultS3ClientBuilder.
Что я пробовал:
  • Объявление S3Client как статической переменной класса
  • Использование @Scope("prototype") для bean-компонента
  • (Как hack) Удаление свойства из карты NAME_HISTORY посредством отражения (что только что привело к аналогичной ошибке для другого свойства)
  • Различные другие стратегии жизненного цикла и создания экземпляров компонента
Вопрос:

[*]Как я могу предотвратить эту ошибку?


Подробнее здесь: https://stackoverflow.com/questions/797 ... d-s3client
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»