diff --git a/src/main/java/org/redisson/Redisson.java b/src/main/java/org/redisson/Redisson.java index bf481de52..9105c74df 100755 --- a/src/main/java/org/redisson/Redisson.java +++ b/src/main/java/org/redisson/Redisson.java @@ -390,7 +390,12 @@ public class Redisson implements RedissonClient { public RRemoteService getRemoteSerivce() { return new RedissonRemoteService(this); } - + + @Override + public RRemoteService getRemoteSerivce(String name) { + return new RedissonRemoteService(this, name); + } + @Override public RSortedSet getSortedSet(String name) { return new RedissonSortedSet(commandExecutor, name); diff --git a/src/main/java/org/redisson/RedissonClient.java b/src/main/java/org/redisson/RedissonClient.java index 294752add..fa7ea0bb8 100755 --- a/src/main/java/org/redisson/RedissonClient.java +++ b/src/main/java/org/redisson/RedissonClient.java @@ -594,12 +594,20 @@ public interface RedissonClient { RScript getScript(); /** - * Returns object for remote operations + * Returns object for remote operations prefixed with the default name (redisson_remote_service) * * @return */ RRemoteService getRemoteSerivce(); - + + /** + * Returns object for remote operations prefixed with the specified name + * + * @param name The name used as the Redis key prefix for the services + * @return + */ + RRemoteService getRemoteSerivce(String name); + /** * Return batch object which executes group of * command in pipeline. diff --git a/src/main/java/org/redisson/RedissonRemoteService.java b/src/main/java/org/redisson/RedissonRemoteService.java index 5e2c813df..b2f823136 100644 --- a/src/main/java/org/redisson/RedissonRemoteService.java +++ b/src/main/java/org/redisson/RedissonRemoteService.java @@ -56,9 +56,15 @@ public class RedissonRemoteService implements RRemoteService { private final Map beans = PlatformDependent.newConcurrentHashMap(); private final Redisson redisson; + private final String name; public RedissonRemoteService(Redisson redisson) { + this(redisson, "redisson_remote_service"); + } + + public RedissonRemoteService(Redisson redisson, String name) { this.redisson = redisson; + this.name = name; } @Override @@ -80,7 +86,7 @@ public class RedissonRemoteService implements RRemoteService { } for (int i = 0; i < executorsAmount; i++) { - String requestQueueName = "redisson_remote_service:{" + remoteInterface.getName() + "}"; + String requestQueueName = name + ":{" + remoteInterface.getName() + "}"; RBlockingQueue requestQueue = redisson.getBlockingQueue(requestQueueName); subscribe(remoteInterface, requestQueue); } @@ -107,7 +113,7 @@ public class RedissonRemoteService implements RRemoteService { } final RemoteServiceMethod method = beans.get(new RemoteServiceKey(remoteInterface, request.getMethodName())); - final String responseName = "redisson_remote_service:{" + remoteInterface.getName() + "}:" + request.getRequestId(); + final String responseName = name + ":{" + remoteInterface.getName() + "}:" + request.getRequestId(); Future> ackClientsFuture = send(request.getAckTimeout(), responseName, new RemoteServiceAck()); ackClientsFuture.addListener(new FutureListener>() { @@ -167,13 +173,13 @@ public class RedissonRemoteService implements RRemoteService { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String requestId = generateRequestId(); - String requestQueueName = "redisson_remote_service:{" + remoteInterface.getName() + "}"; + String requestQueueName = name + ":{" + remoteInterface.getName() + "}"; RBlockingQueue requestQueue = redisson.getBlockingQueue(requestQueueName); RemoteServiceRequest request = new RemoteServiceRequest(requestId, method.getName(), args, ackTimeUnit.toMillis(ackTimeout), executionTimeUnit.toMillis(executionTimeout), System.currentTimeMillis()); requestQueue.add(request); - String responseName = "redisson_remote_service:{" + remoteInterface.getName() + "}:" + requestId; + String responseName = name + ":{" + remoteInterface.getName() + "}:" + requestId; RBlockingQueue responseQueue = redisson.getBlockingQueue(responseName); RemoteServiceAck ack = (RemoteServiceAck) responseQueue.poll(ackTimeout, ackTimeUnit); diff --git a/src/test/java/org/redisson/RedissonRemoteServiceTest.java b/src/test/java/org/redisson/RedissonRemoteServiceTest.java index 5739bc7bc..a47a065ef 100644 --- a/src/test/java/org/redisson/RedissonRemoteServiceTest.java +++ b/src/test/java/org/redisson/RedissonRemoteServiceTest.java @@ -104,5 +104,21 @@ public class RedissonRemoteServiceTest extends BaseTest { r1.shutdown(); r2.shutdown(); } - + + @Test + public void testInvocationWithServiceName() { + String name = "MyServiceName"; + + RedissonClient r1 = Redisson.create(); + r1.getRemoteSerivce(name).register(RemoteInterface.class, new RemoteImpl()); + + RedissonClient r2 = Redisson.create(); + RemoteInterface ri = r2.getRemoteSerivce(name).get(RemoteInterface.class); + + ri.voidMethod("someName", 100L); + assertThat(ri.resultMethod(100L)).isEqualTo(200); + + r1.shutdown(); + r2.shutdown(); + } }