Код: Выделить всё
@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.
При отладке я вижу, что это происходит из класса 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);
}
Этот метод вызывается S3ExpressAuthSchemeProvider, который, в свою очередь, вызывается DefaultS3ClientBuilder.
Что я пробовал:
- Объявление S3Client как статической переменной класса
- Использование @Scope("prototype") для bean-компонента
- (Как hack) Удаление свойства из карты NAME_HISTORY посредством отражения (что только что привело к аналогичной ошибке для другого свойства)
- Различные другие стратегии жизненного цикла и создания экземпляров компонента
[*]Как я могу предотвратить эту ошибку?
Подробнее здесь: https://stackoverflow.com/questions/797 ... d-s3client
Мобильная версия