From 989ddf75520b737c1f476aeb966d499c98206aea Mon Sep 17 00:00:00 2001 From: seakider Date: Sat, 4 Jan 2025 19:50:45 +0800 Subject: [PATCH] Feature - add MapEntryListener in RedissonSpringCacheManager Signed-off-by: seakider --- .../redisson/spring/cache/CacheConfig.java | 24 +++++++++++++++ .../spring/cache/CacheConfigSupport.java | 29 ++++++++++++++----- .../cache/RedissonSpringCacheManager.java | 4 +++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/redisson/src/main/java/org/redisson/spring/cache/CacheConfig.java b/redisson/src/main/java/org/redisson/spring/cache/CacheConfig.java index 5149bdd63..5da1df725 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/CacheConfig.java +++ b/redisson/src/main/java/org/redisson/spring/cache/CacheConfig.java @@ -15,11 +15,15 @@ */ package org.redisson.spring.cache; +import org.redisson.api.map.event.MapEntryListener; + import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -35,6 +39,8 @@ public class CacheConfig { private long maxIdleTime; private int maxSize; + + private final List listeners = new ArrayList<>(); /** * Creates config object with @@ -103,6 +109,24 @@ public class CacheConfig { this.maxIdleTime = maxIdleTime; } + /** + * listener will invoke if one of the ttl,maxIdleTime,maxSize is set + * listener Is one of the following implementations: + * EntryCreatedListener + * EntryExpiredListener + * EntryRemovedListener + * EntryUpdatedListener + * + * @param listener listener + */ + public void addListener(MapEntryListener listener) { + listeners.add(listener); + } + + protected List getListeners() { + return listeners; + } + /** * Read config objects stored in JSON format from String * diff --git a/redisson/src/main/java/org/redisson/spring/cache/CacheConfigSupport.java b/redisson/src/main/java/org/redisson/spring/cache/CacheConfigSupport.java index d84026255..a86ad8692 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/CacheConfigSupport.java +++ b/redisson/src/main/java/org/redisson/spring/cache/CacheConfigSupport.java @@ -15,6 +15,14 @@ */ package org.redisson.spring.cache; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.redisson.api.map.event.MapEntryListener; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -22,10 +30,6 @@ import java.io.Reader; import java.net.URL; import java.util.Map; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; - /** * * @author Nikita Koksharov @@ -33,9 +37,20 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; */ public class CacheConfigSupport { - ObjectMapper jsonMapper = new ObjectMapper(); - ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); - + ObjectMapper jsonMapper = createMapper(null); + ObjectMapper yamlMapper = createMapper(new YAMLFactory()); + + @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class") + public static class ClassMixIn { + } + + private ObjectMapper createMapper(JsonFactory mapping) { + ObjectMapper mapper = new ObjectMapper(mapping); + mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + mapper.addMixIn(MapEntryListener.class, ClassMixIn.class); + return mapper; + } + public Map fromJSON(String content) throws IOException { return jsonMapper.readValue(content, new TypeReference>() {}); } diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java index 9079760e2..9337dc0a2 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.redisson.api.RMap; import org.redisson.api.RMapCache; import org.redisson.api.RedissonClient; +import org.redisson.api.map.event.MapEntryListener; import org.redisson.client.codec.Codec; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.InitializingBean; @@ -269,6 +270,9 @@ public class RedissonSpringCacheManager implements CacheManager, ResourceLoaderA cache = oldCache; } else { map.setMaxSize(config.getMaxSize()); + for (MapEntryListener listener : config.getListeners()) { + map.addListener(listener); + } } return cache; }