diff --git a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java index 503085e21..8888af165 100644 --- a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java +++ b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java @@ -170,6 +170,7 @@ public class RedissonLocalCachedMap extends RedissonExpirable implements R private RMap map; private Cache cache; private int invalidateEntryOnChange; + private int invalidationListenerId; protected RedissonLocalCachedMap(RedissonClient redisson, CommandAsyncExecutor commandExecutor, String name, LocalCachedMapOptions options) { super(commandExecutor, name); @@ -198,18 +199,20 @@ public class RedissonLocalCachedMap extends RedissonExpirable implements R } invalidationTopic = redisson.getTopic(name + ":topic"); - invalidationTopic.addListener(new MessageListener() { - @Override - public void onMessage(String channel, Object msg) { - if (msg instanceof LocalCachedMapClear) { - cache.clear(); - } - if (msg instanceof LocalCachedMapInvalidate) { - CacheKey key = new CacheKey(((LocalCachedMapInvalidate)msg).getKeyHash()); - cache.remove(key); + if (options.isInvalidateEntryOnChange()) { + invalidationListenerId = invalidationTopic.addListener(new MessageListener() { + @Override + public void onMessage(String channel, Object msg) { + if (msg instanceof LocalCachedMapClear) { + cache.clear(); + } + if (msg instanceof LocalCachedMapInvalidate) { + CacheKey key = new CacheKey(((LocalCachedMapInvalidate)msg).getKeyHash()); + cache.remove(key); + } } - } - }); + }); + } } @Override @@ -359,6 +362,13 @@ public class RedissonLocalCachedMap extends RedissonExpirable implements R Arrays.asList(getName(), invalidationTopic.getChannelNames().get(0)), encodedKey, encodedValue, msg, invalidateEntryOnChange); } + + @Override + public void destroy() { + if (invalidationListenerId != 0) { + invalidationTopic.removeListener(invalidationListenerId); + } + } @Override public V remove(Object key) { diff --git a/redisson/src/main/java/org/redisson/api/RDestroyable.java b/redisson/src/main/java/org/redisson/api/RDestroyable.java new file mode 100644 index 000000000..27a64f39c --- /dev/null +++ b/redisson/src/main/java/org/redisson/api/RDestroyable.java @@ -0,0 +1,15 @@ +package org.redisson.api; + +/** + * + * @author Nikita Koksharov + * + */ +public interface RDestroyable { + + /** + * Allows to destroy object then it's not necessary anymore. + */ + void destroy(); + +} diff --git a/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java b/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java index 6cfab311b..8a99bb3b3 100644 --- a/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java +++ b/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java @@ -28,7 +28,7 @@ import java.util.Map; * @param * @param */ -public interface RLocalCachedMap extends Map, RExpirable, RLocalCachedMapAsync { +public interface RLocalCachedMap extends Map, RExpirable, RLocalCachedMapAsync, RDestroyable { /** * Associates the specified value with the specified key.