Я хочу заменить пружинный объект couchbaseTemplate, который создается при запуске пользовательским объектом Bucket (где имя пользователя <> bucketName) и объектом Cluster. Я могу создать и запустить приложение. Также запускается приложение CouchbaseTemplate.Через 2 дня я получу новое имя пользователя и пароль. Так что я хочу перезагрузить couchbaseTemplate, Cluster и Bucket - 3 новых объекта в весеннем контексте, чтобы новый couchbaseTemplate начал работать. Я попытался заменить couchbaseTemplate из applicationContext.по телефону.
applicationContext.destroyBean( "couchbaseTemplate",applicationContext.getBean("couchbaseTemplate"))
applicationContext.registerSingleton( "couchbaseTemplate",couchbaseTemplate);
Но этот код не работает для меня и говорит, что бин все еще присутствует в контексте.У меня вопрос
- это правильный способ сделать это?
- Есть ли какой-нибудь более чистый способ установить объект couchbaseTemplate, cluster и Bucket, не затрагивая живую транзакцию.
- Подойдет ли в этом случае подход RefreshScope для перезагрузки бина? Однако это не гарантирует перезагрузку всех зависимых бинов, зависящих от бина, аннотируемого @ RefreshScope.
Объем обращений к базе данных couchbase равен 100 в секунду..
Дальнейшие выводы Я попытался продолжить и обнаружил, что хранилище spring-data-couchbase можно изменить, чтобы позволить настройку Bucket внутри CouchbaseTemplate.java, используя AtomicReference, чтобы клиент мог использовать Bucket * 1016.*
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 для первого повторного запроса, когда меняю место, созданное с использованием нового имени пользователя и пароля.Пожалуйста, предложите.