1

我想替换由自定义 Bucket 对象(其中用户名是 <> bucketName)和 Cluster 对象在启动时生成的 spring couchbaseTemplate 对象。我能够创建应用程序并使应用程序运行。CouchbaseTemplate 也被调用。2 天后,我将获得新的用户名、密码。所以我想在 spring 上下文中重新加载 couchbaseTemplate、Cluster 和 Bucket - 3 个新对象,以便新的 couchbaseTemplate 开始运行。我试图从 applicationContext 替换 couchbaseTemplate通过调用。

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

但是这段代码对我不起作用,并且说 bean 仍然存在于上下文中。我的问题是

  1. 这是正确的做法吗?
  2. 有没有更简洁的方法来设置 couchbaseTemplate、cluster 和 Bucket 对象而不影响实时事务。
  3. RefreshScope 方法在这里重新加载 bean 有帮助吗?但是,这并不能保证所有依赖的 bean 重新加载都依赖于用 @RefreshScope 注释的 bean。

couchbase DB 的点击量是 100/second 。

进一步的发现我进一步尝试发现可以修改 spring-data-couchbase 存储库以允许使用 AtomicReference 在 CouchbaseTemplate.java 中设置 Bucket 以供客户端使用 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。请建议。

4

1 回答 1

-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 Object.From 那里

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

这将允许现有存储桶在一定时间间隔后关闭,以便它可以完成其挂起的查询。新查询将在新存储桶上开始执行。

于 2019-06-29T15:40:08.680 回答