замените объект spring CouchbaseTemplate новым кластером, объектом Bucket, не влияя на транзакции или перезапуская приложение

Я хочу заменить объект 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-компонент все еще присутствует в контексте. мой вопрос

  1. это правильный способ сделать это?
  2. Есть ли более чистый способ установить объект CouchbaseTemplate, Cluster и Bucket, не влияя на транзакцию в реальном времени.
  3. Поможет ли здесь подход 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 для первого запроса, когда я меняю ведро, созданное с использованием нового имени пользователя и пароля. Пожалуйста, предложите.


person user2758406    schedule 03.03.2019    source источник
comment
Может ли configureRepositoryOperationsMapping изменить шаблон во время выполнения, вызвав set Default template через 2 дня?   -  person user2758406    schedule 05.03.2019


Ответы (1)


Дублируйте класс CouchbaseTemplate в своем собственном пакете. Разрешить настройку ведра в этом классе.

   /** Duplicate the CouchbaseTemplate from springData and allow setter method
 for Bucket in that class .the couchbaseTemplate is instantiated in spring from AbstractCouchbaseConfiguration class extension. **/
        @Autowired CustomCouchbaseTemplate customCouchbaseTemplate 

в вашем классе, который будет создавать новый объект Bucket. Оттуда

Bucket oldBucket= customCouchbaestemplate.getBucket();
customCouchbaestemplate.setBucket( newBucket);
Thread.sleep(100000); //Time in ms

Это позволит существующему сегменту закрыться через определенный интервал, чтобы он мог завершить свои ожидающие запросы. Новые запросы начнут выполняться в новом сегменте.

person user2758406    schedule 29.06.2019