gpt4 book ai didi

java - 如果 Couchbase 连接失败,如何在运行时禁用缓存?

转载 作者:行者123 更新时间:2023-11-30 10:29:10 25 4
gpt4 key购买 nike

我在这里遇到了类似的问题 - How to disable Redis Caching at run time if redis connection failed .我的应用程序正在使用 @Cacheable在大多数数据库/静态资源调用的服务层。

缓存由 Couchbase 提供支持,每当应用程序无法连接 Couchbase 节点时,应用程序就会关闭。这是我们没有预料到的,我们希望只要连接失败,数据就应该从源系统提供。

我们尝试实现 CacheErrorHandler但它没有按预期工作,因为我们想执行调用服务并返回响应的实际方法,而不是记录缓存失败,基本上绕过缓存,只要 Couchbase 节点已启动或连接已建立 从缓存中获取数据。

知道我们如何实现它吗?

最佳答案

感谢@Daniel Bickler 的建议,下面是我引用@John Blum 编写的实现 answer .

CouchbaseCustomCacheManager:

import java.util.Map;
import org.springframework.cache.Cache;
import com.couchbase.client.spring.cache.CacheBuilder;
import com.couchbase.client.spring.cache.CouchbaseCacheManager;

public class CouchbaseCustomCacheManager extends CouchbaseCacheManager {

public CouchbaseCustomCacheManager(
final Map<String, CacheBuilder> initialCaches) {
super(initialCaches);
}

@Override
public Cache getCache(String name) {
return new CouchbaseCacheWrapper(super.getCache(name));
}

protected static class CouchbaseCacheWrapper implements Cache {

private final Cache delegate;

public CouchbaseCacheWrapper(Cache couchbaseCache) {
this.delegate = couchbaseCache;
}

@Override
public String getName() {
try {
return delegate.getName();
} catch (Exception e) {
return null;
}
}

@Override
public Object getNativeCache() {
try {
return delegate.getNativeCache();
} catch (Exception e) {
return null;
}
}

@Override
public ValueWrapper get(Object key) {
try {
return delegate.get(key);
} catch (Exception e) {
return null;
}
}

@Override
public <T> T get(Object key, Class<T> type) {
try {
return delegate.get(key, type);
} catch (Exception e) {
return null;
}
}

@Override
public void put(Object key, Object value) {
try {
delegate.put(key, value);
} catch (Exception e) {
try {
handleErrors(e);
} catch (Exception e1) {
}
}
}

@Override
public ValueWrapper putIfAbsent(Object key, Object value) {
try {
return delegate.putIfAbsent(key, value);
} catch (Exception e) {
return null;
}
}

@Override
public void evict(Object key) {
try {
delegate.evict(key);
} catch (Exception e) {
try {
handleErrors(e);
} catch (Exception e1) {
}
}
}

@Override
public void clear() {
try {
delegate.clear();
} catch (Exception e) {
try {
handleErrors(e);
} catch (Exception e1) {
}
}
}

protected <T> T handleErrors(Exception e) throws Exception {
if (e instanceof Exception) {
return null;
} else {
throw e;
}
}
}

}

并将其用作:

@Bean
public CacheManager cacheManager() {
final Map<String, CacheBuilder> cache = new HashMap<>();
for (final String appCache : "127.0.0.1,127.0.0.2,127.0.0.3".split(",")) {
cache.put(appCache, CacheBuilder.newInstance(CouchbaseCluster.create().openBucket(
"default", "")));
}
return new CouchbaseCustomCacheManager(cache);
}

关于java - 如果 Couchbase 连接失败,如何在运行时禁用缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44183715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com