मेरे पास एक कस्टम CacheResolver
के साथ एक स्प्रिंग बूट प्रोजेक्ट है क्योंकि मुझे रनटाइम पर फैसला करने की आवश्यकता है जिसे मैं उपयोग करना चाहता हूं, मेरे पास कोई संकलन त्रुटियां नहीं हैं, लेकिन जब मैं कुछ परीक्षण करता हूं और ब्रेक डालता हूं मेरे कस्टम CacheResolver
पर इंगित करें, यह कभी भी इसमें कदम नहीं उठाता है।कस्टम कैश रीसोल्वर काम नहीं कर रहा है
यह कैश के लिए मेरे विन्यास वर्ग है:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.DEFAULT)
@CacheConfig(cacheResolver = "wgstCacheResolver")
public class CacheableDao<T extends Storable> extends AbstractDao<T> {
private final Logger logger = LoggerFactory.getLogger(CacheableDao.class);
public CacheableDao(final Bucket bucket, final Class<T> typeParameterClass, final DocumentType documentType) {
super(bucket, typeParameterClass, documentType);
}
@Cacheable(key = "{#root.methodName, #root.target.generateFullKey(#key)}")
public T get(final String key) throws DatastoreAccessException, ObjectMappingException {
//do something
}
.
.
.
}
मेरे पास है:
@Configuration
@EnableCaching(proxyTargetClass = true)
@PropertySource(CacheConfig.CLASSPATH_DEPLOY_CACHE_PROPERTIES_PROPERTIES)
public class CacheConfig extends CachingConfigurerSupport{
public static final String CLASSPATH_DEPLOY_CACHE_PROPERTIES_PROPERTIES = "classpath:/deploy/cache-properties.properties";
public static final String CACHEABLE_DOCUMENTS_PROPERTY = "cacheable.documents";
public static final String TTL_CACHEABLE_DOCUMENTS_PROPERTY = "ttl.cacheable.documents";
public static final String SIZED_CACHEABLE_DOCUMENTS_PROPERTY = "sized.cacheable.documents";
public static final String CACHE_NAME = "permanentCache";
public static final String TTL_CACHE = "ttlCache";
public static final String SIZED_CACHE = "sizedCache";
public static final String CACHEABLE_DOCUMENTS = "cacheableDocuments";
public static final String SIZED_CACHEABLE_DOCUMENTS = "sizedCacheableDocuments";
public static final int WEIGHT = 1000000;
public static final int TO_KBYTES = 1000;
@Inject
protected Environment environment;
//@Bean
@Override
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
GuavaCache sizedCache = new GuavaCache(SIZED_CACHE, CacheBuilder.newBuilder().maximumWeight(WEIGHT).weigher(
(key, storable) -> {
String json = ((Storable) storable).toJson();
return json.getBytes().length/TO_KBYTES;
}
).build());
GuavaCache permanentCache = new GuavaCache(CACHE_NAME,CacheBuilder.newBuilder().build());
//GuavaCache ttlCache = new GuavaCache(TTL_CACHE, CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build());
cacheManager.setCaches(Arrays.asList(permanentCache,sizedCache));
return cacheManager;
}
@Bean(name = "wgstCacheResolver")
@Override
public CacheResolver cacheResolver(){
CacheResolver cacheResolver = new WgstCacheResolver(cacheManager(),cacheableDocuments(),sizedCacheableDocuments());
return cacheResolver;
}
@Bean(name = CACHEABLE_DOCUMENTS)
public List<String> cacheableDocuments(){
String[] cacheableDocuments = StringUtils.commaDelimitedListToStringArray(environment.getProperty(CACHEABLE_DOCUMENTS_PROPERTY));
return Arrays.asList(cacheableDocuments);
}
@Bean(name = SIZED_CACHEABLE_DOCUMENTS)
public List<String> sizedCacheableDocuments(){
String[] sizedCacheableDocuments = StringUtils.commaDelimitedListToStringArray(environment.getProperty(SIZED_CACHEABLE_DOCUMENTS_PROPERTY));
return Arrays.asList(sizedCacheableDocuments);
}
}
यहाँ मेरी CacheResolver
public class WgstCacheResolver extends AbstractCacheResolver {
private final List<String> cacheableDocuments;
private final List<String> sizedCacheableDocuments;
public WgstCacheResolver(final CacheManager cacheManager,final List<String> cacheableDocuments, final List<String> sizedCacheableDocuments) {
super(cacheManager);
this.cacheableDocuments = cacheableDocuments;
this.sizedCacheableDocuments = sizedCacheableDocuments;
}
/**
* Resolves the cache(s) to be updated on runtime
* @param context
* @return*/
@Override
protected Collection<String> getCacheNames(final CacheOperationInvocationContext<?> context) {
final Collection<String> cacheNames = new ArrayList<>();
final AbstractDao dao = (AbstractDao)context.getTarget();
final String documentType = dao.getDocumentType().toString();
if (cacheableDocuments.contains(documentType)){
cacheNames.add("permanentCache");
}
if (sizedCacheableDocuments.contains(documentType)){
cacheNames.add("sizedCache");
}
return cacheNames;
}
}
मेरी डीएओ
और यहाँ मैं कहाँ कैश का उपयोग करें AbstractCacheResolver
को विस्तारित करने के बजाय CacheResolver
को लागू करने का प्रयास किया लेकिन यह नहीं बनाया गया ई कोई अंतर।
धन्यवाद।
ठीक है आपके पास कैश नाम नहीं है इसलिए यदि कैशिंग कार्य करता है, तो उसे कैश नाम को हल करना होगा अन्यथा यह अपवाद फेंक देगा। मेरा सबसे अच्छा अनुमान यह है कि कैशिंग बिल्कुल काम नहीं करती है। आपकी कॉन्फ़िगरेशन भी बहुत _weird_ है। _default_ 'कैश रेसोलवर' प्रदान करने के लिए आप 'कैशिंग कॉन्फ़िगरेशन' का उपयोग करते हैं, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है। यदि आप इसे प्रति ऑपरेशन (विशेष नाम के साथ) निर्दिष्ट करना चाहते हैं, तो इसे कहीं और परिभाषित करें (डिफ़ॉल्ट के रूप में नहीं)। –
धन्यवाद @ स्टीफन-निकोल, आपने मुझे सही दिशा में इंगित किया, मैंने 'कैशकॉन्फिग' एनोटेशन के साथ उपलब्ध कैश नामों सहित समस्या को ठीक किया, मेरे परीक्षण चलाए और डीबग किया और अब कस्टम 'कैश रेसोलवर' उम्मीद के अनुसार काम कर रहा है। मैंने माना कि कैश नामों को 'कैश रेसोलवर' के रूप में शामिल करने की आवश्यकता नहीं होगी। – tommylii
आपका स्वागत है लेकिन कैश नामों की आवश्यकता नहीं है। जैसे मैंने कहा, अगर आपके कैश रिज़ॉल्वर को नहीं बुलाया गया था और आपके पास कोई अपवाद नहीं था, तो शायद आपके पास कोई कैशिंग नहीं थी। नीचे दिया गया उत्तर गलत है (जब तक कोई बग न हो) –