diff --git a/redisson/src/main/java/org/redisson/api/Node.java b/redisson/src/main/java/org/redisson/api/Node.java index 0f1ed2541..ef2d80625 100644 --- a/redisson/src/main/java/org/redisson/api/Node.java +++ b/redisson/src/main/java/org/redisson/api/Node.java @@ -25,6 +25,13 @@ import java.net.InetSocketAddress; */ public interface Node { + /** + * Returns current Redis server time in seconds + * + * @return + */ + long time(); + /** * Returns node type * diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index 0c1ea7833..34dd29629 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -41,9 +41,11 @@ import org.redisson.client.protocol.convertor.VoidReplayConvertor; import org.redisson.client.protocol.decoder.ClusterNodesDecoder; import org.redisson.client.protocol.decoder.FlatNestedMultiDecoder; import org.redisson.client.protocol.decoder.KeyValueObjectDecoder; +import org.redisson.client.protocol.decoder.ListMultiDecoder; import org.redisson.client.protocol.decoder.ListResultReplayDecoder; import org.redisson.client.protocol.decoder.ListScanResult; import org.redisson.client.protocol.decoder.ListScanResultReplayDecoder; +import org.redisson.client.protocol.decoder.LongMultiDecoder; import org.redisson.client.protocol.decoder.MapScanResult; import org.redisson.client.protocol.decoder.MapScanResultReplayDecoder; import org.redisson.client.protocol.decoder.NestedMultiDecoder; @@ -272,6 +274,7 @@ public interface RedisCommands { RedisCommand PUNSUBSCRIBE = new RedisCommand("PUNSUBSCRIBE", new PubSubStatusDecoder()); RedisStrictCommand> CLUSTER_NODES = new RedisStrictCommand>("CLUSTER", "NODES", new ClusterNodesDecoder()); + RedisStrictCommand> TIME = new RedisStrictCommand>("TIME", new StringListReplayDecoder()); RedisStrictCommand> CLUSTER_INFO = new RedisStrictCommand>("CLUSTER", "INFO", new StringMapDataDecoder()); RedisStrictCommand> SENTINEL_GET_MASTER_ADDR_BY_NAME = new RedisStrictCommand>("SENTINEL", "GET-MASTER-ADDR-BY-NAME", new StringListReplayDecoder()); diff --git a/redisson/src/main/java/org/redisson/connection/RedisClientEntry.java b/redisson/src/main/java/org/redisson/connection/RedisClientEntry.java index f0c3dc2b5..674c80d89 100644 --- a/redisson/src/main/java/org/redisson/connection/RedisClientEntry.java +++ b/redisson/src/main/java/org/redisson/connection/RedisClientEntry.java @@ -16,12 +16,15 @@ package org.redisson.connection; import java.net.InetSocketAddress; +import java.util.List; import java.util.Map; import org.redisson.api.ClusterNode; import org.redisson.api.NodeType; import org.redisson.client.RedisClient; import org.redisson.client.RedisConnection; +import org.redisson.client.RedisException; +import org.redisson.client.codec.LongCodec; import org.redisson.client.protocol.RedisCommands; import org.redisson.misc.RPromise; @@ -100,6 +103,21 @@ public class RedisClientEntry implements ClusterNode { return true; } + public long time() { + RedisConnection c = null; + try { + c = connect(); + List parts = c.sync(RedisCommands.TIME); + return Long.valueOf(parts.get(0)); + } catch (Exception e) { + throw new RedisException(e.getMessage(), e); + } finally { + if (c != null) { + c.closeAsync(); + } + } + } + @Override public Map info() { RedisConnection c = null; diff --git a/redisson/src/test/java/org/redisson/RedissonTest.java b/redisson/src/test/java/org/redisson/RedissonTest.java index 29c116219..2de3ca998 100644 --- a/redisson/src/test/java/org/redisson/RedissonTest.java +++ b/redisson/src/test/java/org/redisson/RedissonTest.java @@ -226,8 +226,18 @@ public class RedissonTest { Assert.assertTrue(r.isShutdown()); } -// @Test - public void test() { + @Test + public void testTime() { + NodesGroup nodes = redisson.getNodesGroup(); + Assert.assertEquals(1, nodes.getNodes().size()); + Iterator iter = nodes.getNodes().iterator(); + + Node node1 = iter.next(); + assertThat(node1.time()).isGreaterThan(100000L); + } + + @Test + public void testPing() { NodesGroup nodes = redisson.getNodesGroup(); Assert.assertEquals(1, nodes.getNodes().size()); Iterator iter = nodes.getNodes().iterator();