Я хочу заменить объект spring CouchbaseTemplate, который генерируется при запуске, с помощью настраиваемого объекта Bucket (где имя пользователя ‹> BucketName) и объекта Cluster. Я могу создать и запустить приложение. CouchbaseTemplate также вызывается. Через 2 дня я получу новое имя пользователя, пароль. Поэтому я хочу перезагрузить CouchbaseTemplate, Cluster и Bucket - 3 новых объекта в весеннем контексте, чтобы новый CouchbaseTemplate начал работать. Я попытался заменить CouchbaseTemplate из applicationContext. позвонив.
applicationContext.destroyBean( "couchbaseTemplate",applicationContext.getBean("couchbaseTemplate"))
applicationContext.registerSingleton( "couchbaseTemplate",couchbaseTemplate);
Но этот код не работает для меня и говорит, что bean-компонент все еще присутствует в контексте. мой вопрос
- это правильный способ сделать это?
- Есть ли более чистый способ установить объект CouchbaseTemplate, Cluster и Bucket, не влияя на транзакцию в реальном времени.
- Поможет ли здесь подход RefreshScope к перезагрузке bean-компонента? Однако это не гарантирует перезагрузку всех зависимых bean-компонентов, зависящих от bean-компонента, который помечен @RefreshScope.
Объем обращений к Couchbase DB составляет 100/сек.
Дальнейшие выводы Я попытался продолжить и обнаружил, что репозиторий spring-data-couchbase можно изменить, чтобы разрешить настройку Bucket внутри CouchbaseTemplate.java с использованием AtomicReference для клиента, чтобы использовать Bucket
AtomicReference<Bucket> bucketRef ;
Bucket getClient(atomicReferenceBucket.get()) ;
void setAtomicReferenceBucket(Bucket bucket) {
AtomicReference<Bucket> bucketRef= new AtomicReference(bucket) ;
return bucketRef;
}
resetBucket(Bucket bucket){
bucketRef.set(bucket);
}
заменить всех клиентов методом getClient()
Однако я получаю requestCancelledInFlightException для первого запроса, когда я меняю ведро, созданное с использованием нового имени пользователя и пароля. Пожалуйста, предложите.