diff --git a/docs/src/reference/docbook/appendix/appendix-command-reference.xml b/docs/src/reference/docbook/appendix/appendix-command-reference.xml index f00bd788e..224230164 100644 --- a/docs/src/reference/docbook/appendix/appendix-command-reference.xml +++ b/docs/src/reference/docbook/appendix/appendix-command-reference.xml @@ -26,7 +26,7 @@ CLIENT GETNAME- CLIENT KILLX CLIENT LIST- - CLIENT SETNAME- + CLIENT SETNAMEX CONFIG GETX CONFIG RESETSTATX CONFIG REWRITE- diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index b4f0addc2..beeac1aa9 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -2239,4 +2239,22 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return convertedResults; } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + this.delegate.setClientName(name); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.StringRedisConnection#setClientName(java.lang.String) + */ + @Override + public void setClientName(String name) { + setClientName(this.serializer.serialize(name)); + } + } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java index 3e34dffba..3219df9f4 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java @@ -171,4 +171,10 @@ public interface RedisServerCommands { */ void killClient(String host, int port); + /** + * Assign given name to current connection. + * + * @since 1.3 + */ + void setClientName(byte[] name); } diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index 20657682e..ae3d9684e 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -292,4 +292,13 @@ public interface StringRedisConnection extends RedisConnection { T eval(String script, ReturnType returnType, int numKeys, String... keysAndArgs); T evalSha(String scriptSha1, ReturnType returnType, int numKeys, String... keysAndArgs); + + /** + * Assign given {@code name} to connection using registered {@link RedisSerializer} for name conversion. + * + * @param name + * @see #setClientName(byte[]) + * @sice 1.3 + */ + void setClientName(String name); } diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index 3af0cd6fa..56a4df482 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -2828,6 +2828,19 @@ public class JedisConnection implements RedisConnection { } } + /* + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + + if (isPipelined() || isQueueing()) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not suppored in transacton / pipeline mode."); + } + + jedis.clientSetname(name); + } + /** * Specifies if pipelined results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Jedis driver diff --git a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java index 26bfb5d8e..2e4656c33 100644 --- a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java @@ -1190,4 +1190,9 @@ public class JredisConnection implements RedisConnection { public void killClient(String host, int port) { throw new UnsupportedOperationException("The 'CLIENT KILL' command is not supported by the JRedis driver."); } + + @Override + public void setClientName(byte[] name) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not supported by the JRedis driver."); + } } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 4b1ac6a65..96836323d 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -2920,6 +2920,21 @@ public class LettuceConnection implements RedisConnection { } } + @Override + public void setClientName(byte[] name) { + + if (isQueueing()) { + pipeline(new LettuceStatusResult(getAsyncConnection().clientSetname(name))); + return; + } + if (isQueueing()) { + transaction(new LettuceTxResult(getConnection().clientSetname(name))); + return; + } + + getAsyncConnection().clientSetname(name); + } + /** * Specifies if pipelined and transaction results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Lettuce driver diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 2849bbf99..bda3701ee 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -2240,6 +2240,26 @@ public class SrpConnection implements RedisConnection { } } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(byte[]) + */ + @Override + public void setClientName(byte[] name) { + + try { + + if (isPipelined()) { + pipeline(new SrpStatusResult(pipeline.client_setname(name))); + return; + } + + this.client.client_setname(name); + } catch (Exception ex) { + throw convertSrpAccessException(ex); + } + } + private List closeTransaction() { List results = Collections.emptyList(); if (txTracker != null) { diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 6fd8135e5..9929e223a 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1884,6 +1884,14 @@ public abstract class AbstractConnectionIntegrationTests { assertThat(time > 0, equalTo(true)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void clientSetNameWorksCorrectly() { + connection.setClientName("foo".getBytes()); + } + protected void verifyResults(List expected) { assertEquals(expected, getResults()); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java index 532a4dcb3..474de96ee 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1710,6 +1710,16 @@ public class DefaultStringRedisConnectionTests { verify(nativeConnection, times(1)).shutdown(eq(ShutdownOption.NOSAVE)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void settingClientNameShouldDelegateToNativeConnection() { + + connection.setClientName("foo"); + verify(nativeConnection, times(1)).setClientName(eq("foo".getBytes())); + } + protected List getResults() { return actual; } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index e18a18fe9..f6994aad1 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -246,4 +246,12 @@ public class JedisConnectionPipelineIntegrationTests extends AbstractConnectionP public void testZAddMultiple() { super.testZAddMultiple(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java index fbbf8fe8e..a3435b7de 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java @@ -191,4 +191,13 @@ public class JedisConnectionTransactionIntegrationTests extends AbstractConnecti public void testRestoreExistingKey() { super.testRestoreExistingKey(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } + } diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 9725cfcda..ab30964d3 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -809,4 +809,13 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat public void testPsetEx() throws Exception { super.testPsetEx(); } + + /** + * @see DATAREDIS-269 + */ + @Override + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } }