замените объект Spring couchbaseTemplate новым кластером, объектом Bucket, не влияя на транзакции или перезапуск приложения. - PullRequest
0 голосов
/ 03 марта 2019

Я хочу заменить пружинный объект couchbaseTemplate, который создается при запуске пользовательским объектом Bucket (где имя пользователя <> bucketName) и объектом Cluster. Я могу создать и запустить приложение. Также запускается приложение CouchbaseTemplate.Через 2 дня я получу новое имя пользователя и пароль. Так что я хочу перезагрузить couchbaseTemplate, Cluster и Bucket - 3 новых объекта в весеннем контексте, чтобы новый couchbaseTemplate начал работать. Я попытался заменить couchbaseTemplate из applicationContext.по телефону.

applicationContext.destroyBean( "couchbaseTemplate",applicationContext.getBean("couchbaseTemplate"))
applicationContext.registerSingleton( "couchbaseTemplate",couchbaseTemplate);

Но этот код не работает для меня и говорит, что бин все еще присутствует в контексте.У меня вопрос

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

1 Ответ

0 голосов
/ 29 июня 2019

Дублируйте класс 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

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

...