From f3efba98f83d88187560910e3a3cebd121e9e555 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 25 Jan 2018 07:00:33 +0300 Subject: [PATCH] Fixed - MapCache listener not working on cross-platform environment. #1205 #1189 --- .../java/org/redisson/RedissonMapCache.java | 22 +++++++++++-------- .../redisson/codec/MapCacheEventCodec.java | 7 +++--- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonMapCache.java b/redisson/src/main/java/org/redisson/RedissonMapCache.java index 8e025f209..96e731351 100644 --- a/redisson/src/main/java/org/redisson/RedissonMapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonMapCache.java @@ -16,7 +16,6 @@ package org.redisson; import java.math.BigDecimal; -import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1700,9 +1699,14 @@ public class RedissonMapCache extends RedissonMap implements RMapCac if (listener == null) { throw new NullPointerException(); } + + RFuture> serverFuture = commandExecutor.readAsync((String)null, StringCodec.INSTANCE, RedisCommands.INFO_SERVER); + serverFuture.syncUninterruptibly(); + String os = serverFuture.getNow().get("os"); + boolean isWindows = os.contains("Windows"); if (listener instanceof EntryRemovedListener) { - RTopic> topic = redisson.getTopic(getRemovedChannelName(), new MapCacheEventCodec(codec)); + RTopic> topic = redisson.getTopic(getRemovedChannelName(), new MapCacheEventCodec(codec, isWindows)); return topic.addListener(new MessageListener>() { @Override public void onMessage(String channel, List msg) { @@ -1713,7 +1717,7 @@ public class RedissonMapCache extends RedissonMap implements RMapCac } if (listener instanceof EntryCreatedListener) { - RTopic> topic = redisson.getTopic(getCreatedChannelName(), new MapCacheEventCodec(codec)); + RTopic> topic = redisson.getTopic(getCreatedChannelName(), new MapCacheEventCodec(codec, isWindows)); return topic.addListener(new MessageListener>() { @Override public void onMessage(String channel, List msg) { @@ -1724,7 +1728,7 @@ public class RedissonMapCache extends RedissonMap implements RMapCac } if (listener instanceof EntryUpdatedListener) { - RTopic> topic = redisson.getTopic(getUpdatedChannelName(), new MapCacheEventCodec(codec)); + RTopic> topic = redisson.getTopic(getUpdatedChannelName(), new MapCacheEventCodec(codec, isWindows)); return topic.addListener(new MessageListener>() { @Override public void onMessage(String channel, List msg) { @@ -1735,7 +1739,7 @@ public class RedissonMapCache extends RedissonMap implements RMapCac } if (listener instanceof EntryExpiredListener) { - RTopic> topic = redisson.getTopic(getExpiredChannelName(), new MapCacheEventCodec(codec)); + RTopic> topic = redisson.getTopic(getExpiredChannelName(), new MapCacheEventCodec(codec, isWindows)); return topic.addListener(new MessageListener>() { @Override public void onMessage(String channel, List msg) { @@ -1750,16 +1754,16 @@ public class RedissonMapCache extends RedissonMap implements RMapCac @Override public void removeListener(int listenerId) { - RTopic> removedTopic = redisson.getTopic(getRemovedChannelName(), new MapCacheEventCodec(codec)); + RTopic> removedTopic = redisson.getTopic(getRemovedChannelName()); removedTopic.removeListener(listenerId); - RTopic> createdTopic = redisson.getTopic(getCreatedChannelName(), new MapCacheEventCodec(codec)); + RTopic> createdTopic = redisson.getTopic(getCreatedChannelName()); createdTopic.removeListener(listenerId); - RTopic> updatedTopic = redisson.getTopic(getUpdatedChannelName(), new MapCacheEventCodec(codec)); + RTopic> updatedTopic = redisson.getTopic(getUpdatedChannelName()); updatedTopic.removeListener(listenerId); - RTopic> expiredTopic = redisson.getTopic(getExpiredChannelName(), new MapCacheEventCodec(codec)); + RTopic> expiredTopic = redisson.getTopic(getExpiredChannelName()); expiredTopic.removeListener(listenerId); } diff --git a/redisson/src/main/java/org/redisson/codec/MapCacheEventCodec.java b/redisson/src/main/java/org/redisson/codec/MapCacheEventCodec.java index 0cad09901..b370c0aef 100644 --- a/redisson/src/main/java/org/redisson/codec/MapCacheEventCodec.java +++ b/redisson/src/main/java/org/redisson/codec/MapCacheEventCodec.java @@ -25,7 +25,6 @@ import org.redisson.client.protocol.Decoder; import org.redisson.client.protocol.Encoder; import io.netty.buffer.ByteBuf; -import io.netty.util.internal.PlatformDependent; /** * @@ -35,6 +34,7 @@ import io.netty.util.internal.PlatformDependent; public class MapCacheEventCodec implements Codec { private final Codec codec; + private final boolean isWindows; private final Decoder decoder = new Decoder() { @Override @@ -56,9 +56,10 @@ public class MapCacheEventCodec implements Codec { } }; - public MapCacheEventCodec(Codec codec) { + public MapCacheEventCodec(Codec codec, boolean isWindows) { super(); this.codec = codec; + this.isWindows = isWindows; } @Override @@ -93,7 +94,7 @@ public class MapCacheEventCodec implements Codec { private Object decode(ByteBuf buf, State state, Decoder decoder) throws IOException { int keyLen; - if (PlatformDependent.isWindows()) { + if (isWindows) { keyLen = buf.readIntLE(); } else { keyLen = (int) buf.readLongLE();