Author: antelder
Date: Mon Mar 22 20:10:19 2010
New Revision: 926303

URL: http://svn.apache.org/viewvc?rev=926303&view=rev
Log:
Update hazelcast binding to use a seperate ExecutorService for each nested 
invocation (ie a reference calling a service over binding.sca which invokes 
another reference over binding.sca)

Modified:
    
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/main/java/org/apache/tuscany/sca/binding/hazelcast/ReferenceInvoker.java
    
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/test/java/org/apache/tuscany/sca/binding/hazelcast/HazelcastBindingTestCase.java

Modified: 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/main/java/org/apache/tuscany/sca/binding/hazelcast/ReferenceInvoker.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/main/java/org/apache/tuscany/sca/binding/hazelcast/ReferenceInvoker.java?rev=926303&r1=926302&r2=926303&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/main/java/org/apache/tuscany/sca/binding/hazelcast/ReferenceInvoker.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/main/java/org/apache/tuscany/sca/binding/hazelcast/ReferenceInvoker.java
 Mon Mar 22 20:10:19 2010
@@ -74,7 +74,7 @@ public class ReferenceInvoker implements
         String requestXML = getRequestXML(msg);
         Callable<String> callable = new ServiceInvoker(serviceURI, 
operation.getName(), requestXML);
         FutureTask<String> task = new DistributedTask<String>(callable, 
owningMember);
-        ExecutorService executorService = 
hzRegistry.getHazelcastInstance().getExecutorService();
+        ExecutorService executorService = getExecutorService();
         executorService.execute(task);
         try {
             return getResponseNode(task.get());
@@ -83,6 +83,21 @@ public class ReferenceInvoker implements
         }
     }
 
+    /**
+     * Hazelcast ExecutorService can't nest invocations so use a separate 
ExecutorService
+     * for nested calls. See 
http://groups.google.com/group/hazelcast/browse_thread/thread/1cc0b943716476e9
+     */
+    private ExecutorService getExecutorService() {
+        String threadName = Thread.currentThread().getName();
+        if (!threadName.startsWith("hz.executor.")) {
+            return 
hzRegistry.getHazelcastInstance().getExecutorService("binding.sca.1");
+        } else {
+            String oldName = 
threadName.substring(threadName.lastIndexOf("binding.sca."), 
threadName.lastIndexOf(".thread-"));
+            int x = 
Integer.parseInt(oldName.substring(oldName.lastIndexOf('.') + 1));
+            return 
hzRegistry.getHazelcastInstance().getExecutorService(oldName.substring(0, 12) + 
(x + 1));
+        }
+    }
+
     private String getRequestXML(Message msg) {
         Object[] args = msg.getBody();
         String msgXML = domHelper.saveAsString((Node)args[0]);

Modified: 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/test/java/org/apache/tuscany/sca/binding/hazelcast/HazelcastBindingTestCase.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/test/java/org/apache/tuscany/sca/binding/hazelcast/HazelcastBindingTestCase.java?rev=926303&r1=926302&r2=926303&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/test/java/org/apache/tuscany/sca/binding/hazelcast/HazelcastBindingTestCase.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/binding-hazelcast-runtime/src/test/java/org/apache/tuscany/sca/binding/hazelcast/HazelcastBindingTestCase.java
 Mon Mar 22 20:10:19 2010
@@ -47,6 +47,16 @@ public class HazelcastBindingTestCase {
     }
 
     @Test
+    public void testNestedClient() throws Exception {
+        Node client2Node = 
NodeFactory.newInstance().createNode(URI.create("tuscany:HazelcastBindingTestCase"),
  "client2.composite", new String[]{"target/test-classes"});
+        client2Node.start();
+        TestService service = client2Node.getService(TestService.class, 
"TestServiceClient2");
+        assertNotNull(service);
+        assertEquals("Petra", service.echoString("Petra"));
+        client2Node.stop();
+    }
+
+    @Test
     public void testEchoString() throws Exception {
         TestService service = clientNode.getService(TestService.class, 
"TestServiceClient");
         assertNotNull(service);


Reply via email to