Calculator Distributed Sample ============================= This sample implements a simple calculator using SCA components. It uses exactly the same calculator application classes as the calculator sample but runs the application distributed across three nodes. A node in this sample means an instance of the Tuscany SCA java runtime running in a Java virtual machine. The README in the samples directory (the directory above this) provides general instructions about building and running samples. Take a look there first. If you just want to run it to see what happens open four command prompts and navigate to this sample directory in each one. There is one command to be run in each command prompt: ant runDomain ant runNodeB ant runNodeC ant runNodeA Please run the commands in this order. OR if you don't have ant, on Windows use java -cp src\main\resources;..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator-distributed.jar node.LaunchDomain java -cp src\main\resources;..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator-distributed.jar node.LaunchCalculatorNodeB java -cp src\main\resources;..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator-distributed.jar node.LaunchCalculatorNodeC java -cp src\main\resources;..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator-distributed.jar node.LaunchCalculatorNodeA and on *nix do java -cp src/main/resources:../../lib/tuscany-sca-manifest.jar:target/sample-calculator-distributed.jar node.LaunchDomain java -cp src/main/resources:../../lib/tuscany-sca-manifest.jar:target/sample-calculator-distributed.jar node.LaunchCalculatorNodeB java -cp src/main/resources:../../lib/tuscany-sca-manifest.jar:target/sample-calculator-distributed.jar node.LaunchCalculatorNodeC java -cp src/main/resources:../../lib/tuscany-sca-manifest.jar:target/sample-calculator-distributed.jar node.LaunchCalculatorNodeA The processes started on each of these command prompts can be ended by typing 'q'. Sample Overview --------------- The sample provides a single calculator service with a default SCA (java) binding. NodeA exercises this interface by calling add, subtract, multiply and divide operations. In the case of add and subtract the runtime recognises that it can't find these services locally and, using the remote (web services) version of the default SCA binding, contacts the add service running in NodeB and the subtract service running in NodeC. On the command prompt where you started NodeA, you see the output of invoking the calculator functions distributed over NodeB and and NodeC. On the command prompts where you have started NodeB and NodeC, you see log messages that indicate that the add and subtract services where called on these nodes respectively. The sample demonstrates that the calculator application can be distributed across multiple nodes with no change to the application or to the SCA description files. The domain node makes available a web application through which the contributions and composites used in this sample can be navigated. One you have run "ant runDomain" you can point you browser at: http://localhost:9990/ui/workspace/ The contents of the sample are as follows: calculator/ src/ main/ java/ calculator/ CalculatorService.java - the first component, calls +-/* as appropriate AddService.java - adds two numbers AddServiceImpl.java SubtractService.java - subtracts one number from another SubtractServiceImpl.java MultiplyService.java - multiplies two numbers MultiplyServiceImpl.java DivideService.java - divides one number by another DivideServiceImpl.java node/ LaunchCalculatorNodeA.java - runs an sca node configured with the composite describing the main calculator application. If you look inside this class you will see that the node is configured using a URL of the form: http://localhost:9990/node-config/NodeA This retrieves the information required to configure NodeA from the domain. Once the node has been started this launcher then finds the calculator service and calls the various methods. LaunchCalculatorNodeB&C.java - These launchers start nodes B and C which runs the add and subtract services. Unlike NodeA though these launchers just wait once the node has been started. They will service incomming web service requests as they arrive. LaunchDomain.java - the node that provides the domain configuration to the distributed nodes resources/ cloud - The SCA composite files that describe the configuration of each node nodeA - the SCA assembly for nodeA's part of the calculator application nodeB - the SCA assembly for nodeB's part of the calculator application nodeC - the SCA assembly for nodeC's part of the calculator application test/ java/ calculator/ CalculatorDistributedTestCase.java - JUnit test case which runs all of the separate nodes along with the domain in a single VM for test purposes calculator-distributed.png - a pictorial representation of the sample .composite files build.xml - the Ant build file pom.xml - the Maven build file Building And Running The Sample Using Ant ----------------------------------------- With the binary distribution the sample can be built and run using Ant as follows cd calculator-distributed ant compile ant runDomain ant runNodeB ant runNodeC ant runNodeA You should see the following output from the four separate command prompt: runDomain: ted>ant runDomain Buildfile: build.xml runDomain: [java] 26-Mar-2008 12:55:12 org.apache.tuscany.sca.node.launcher.DomainMana gerLauncher main [java] INFO: Apache Tuscany SCA Domain Manager starting... [java] 26-Mar-2008 12:55:13 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 147 JARs from C:\simon\tuscany\sca-java-1.2 \distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca- 1.2-incubating-SNAPSHOT\lib [java] 26-Mar-2008 12:55:13 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 89 JARs from C:\simon\tuscany\sca-java-1.2\ distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca-1 .2-incubating-SNAPSHOT\modules [java] 26-Mar-2008 12:55:19 org.apache.catalina.core.StandardEngine start [java] INFO: Starting Servlet Engine: Apache Tomcat/6.0.14 [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.ContextConfig defau ltWebConfig [java] INFO: No default web.xml [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_0. xsd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_1. xsd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/web-jspt aglibrary_1_1.dtd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/web-jspt aglibrary_1_2.dtd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/web-jspt aglibrary_2_0.xsd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/jsp/resources/web-jspt aglibrary_2_1.xsd [java] 26-Mar-2008 12:55:20 org.apache.catalina.startup.DigesterFactory reg ister [java] WARNING: Could not get url for /javax/servlet/resources/j2ee_web_ser vices_1_1.xsd [java] 26-Mar-2008 12:55:20 org.apache.coyote.http11.Http11Protocol init [java] INFO: Initializing Coyote HTTP/1.1 on http-9990 [java] 26-Mar-2008 12:55:20 org.apache.coyote.http11.Http11Protocol start [java] INFO: Starting Coyote HTTP/1.1 on http-9990 [java] 26-Mar-2008 12:55:20 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ui/home/* [java] 26-Mar-2008 12:55:20 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ui/workspace/* [java] 26-Mar-2008 12:55:20 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ui/files/* [java] 26-Mar-2008 12:55:20 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ui/composite/* [java] 26-Mar-2008 12:55:20 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ui/cloud/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/workspace/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/contribution/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/feed/files/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/files/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/composite/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/composite-source/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/deployable/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/composite-resolved/ * [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/cloud/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/cloud-source/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/composite-config/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/node-config/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/quickstart/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/processes/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/node/processes/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:9990/ping/* [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.node.launcher.DomainMana gerLauncher main [java] INFO: SCA Domain Manager started. [java] 26-Mar-2008 12:55:21 org.apache.tuscany.sca.node.launcher.DomainMana gerLauncher main [java] INFO: Press enter to shutdown. runNodeB: [java] 26-Mar-2008 12:55:42 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: Apache Tuscany SCA Node starting... [java] 26-Mar-2008 12:55:42 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: SCA Node configuration: http://localhost:9990/node-config/NodeB [java] 26-Mar-2008 12:55:42 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 147 JARs from C:\simon\tuscany\sca-java-1.2 \distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca- 1.2-incubating-SNAPSHOT\lib [java] 26-Mar-2008 12:55:42 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 89 JARs from C:\simon\tuscany\sca-java-1.2\ distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca-1 .2-incubating-SNAPSHOT\modules [java] 26-Mar-2008 12:55:42 org.apache.tuscany.sca.node.impl.NodeImpl [java] INFO: Creating node: http://localhost:9990/node-config/NodeB [java] 26-Mar-2008 12:55:45 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading contribution: file:/C:/simon/tuscany/sca-java-1.2/dist ribution/target/apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir/tuscany-sca-1.2-i ncubating-SNAPSHOT/samples/calculator-distributed/./src/main/resources/nodeB/ [java] 26-Mar-2008 12:55:46 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading composite: http://localhost:9990/composite-resolved/co mposite:nodeB;http://sample;CalculatorB [java] 26-Mar-2008 12:55:47 org.apache.tuscany.sca.node.impl.NodeImpl start [java] INFO: Starting node: http://localhost:9990/node-config/NodeB [java] Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor [java] 26-Mar-2008 12:55:53 org.apache.tuscany.sca.http.jetty.JettyServer a ddServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:8200/AddServiceComponent B [java] 26-Mar-2008 12:55:53 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: SCA Node started. [java] 26-Mar-2008 12:55:53 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: Press enter to shutdown. [java] AddService - add 3.0 and 2.0 runNodeC: [java] 26-Mar-2008 12:56:01 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: Apache Tuscany SCA Node starting... [java] 26-Mar-2008 12:56:01 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: SCA Node configuration: http://localhost:9990/node-config/NodeC [java] 26-Mar-2008 12:56:01 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 147 JARs from C:\simon\tuscany\sca-java-1.2 \distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca- 1.2-incubating-SNAPSHOT\lib [java] 26-Mar-2008 12:56:01 org.apache.tuscany.sca.node.launcher.NodeLaunch erUtil collectJARFiles [java] INFO: Runtime classpath: 89 JARs from C:\simon\tuscany\sca-java-1.2\ distribution\target\apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir\tuscany-sca-1 .2-incubating-SNAPSHOT\modules [java] 26-Mar-2008 12:56:01 org.apache.tuscany.sca.node.impl.NodeImpl [java] INFO: Creating node: http://localhost:9990/node-config/NodeC [java] 26-Mar-2008 12:56:03 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading contribution: file:/C:/simon/tuscany/sca-java-1.2/dist ribution/target/apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir/tuscany-sca-1.2-i ncubating-SNAPSHOT/samples/calculator-distributed/./src/main/resources/nodeC/ [java] 26-Mar-2008 12:56:04 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading composite: http://localhost:9990/composite-resolved/co mposite:nodeC;http://sample;CalculatorC [java] 26-Mar-2008 12:56:04 org.apache.tuscany.sca.node.impl.NodeImpl start [java] INFO: Starting node: http://localhost:9990/node-config/NodeC [java] Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor [java] 26-Mar-2008 12:56:10 org.apache.tuscany.sca.http.jetty.JettyServer a ddServletMapping [java] INFO: Added Servlet mapping: http://L3AW203:8300/SubtractServiceComp onentC [java] 26-Mar-2008 12:56:10 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: SCA Node started. [java] 26-Mar-2008 12:56:10 org.apache.tuscany.sca.node.launcher.NodeLaunch er main [java] INFO: Press enter to shutdown. [java] SubtractService - subtract 3.0 and 2.0 runNodeA: [java] 26-Mar-2008 12:56:10 org.apache.tuscany.sca.node.impl.NodeImpl [java] INFO: Creating node: http://localhost:9990/node-config/NodeA [java] 26-Mar-2008 12:56:12 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading contribution: file:/C:/simon/tuscany/sca-java-1.2/dist ribution/target/apache-tuscany-sca-1.2-incubating-SNAPSHOT.dir/tuscany-sca-1.2-i ncubating-SNAPSHOT/samples/calculator-distributed/./src/main/resources/nodeA/ [java] 26-Mar-2008 12:56:13 org.apache.tuscany.sca.node.impl.NodeImpl confi gureNode [java] INFO: Loading composite: http://localhost:9990/composite-resolved/co mposite:nodeA;http://sample;CalculatorA [java] 26-Mar-2008 12:56:14 org.apache.tuscany.sca.assembly.builder.impl.Co mpositeBuilderImpl$1 problem [java] WARNING: Component reference target not found, it might be a remote service: SubtractServiceComponentC [java] 26-Mar-2008 12:56:14 org.apache.tuscany.sca.assembly.builder.impl.Co mpositeBuilderImpl$1 problem [java] WARNING: Component reference target not found, it might be a remote service: AddServiceComponentB [java] 26-Mar-2008 12:56:14 org.apache.tuscany.sca.node.impl.NodeImpl start [java] INFO: Starting node: http://localhost:9990/node-config/NodeA [java] Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor [java] Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor [java] CalculatorService - add 3.0 and 2.0 [java] 3 + 2=5.0 [java] CalculatorService - subtract 3.0 and 2.0 [java] 3 - 2=1.0 [java] CalculatorService - multiply 3.0 and 2.0 [java] 3 * 2=6.0 [java] CalculatorService - divide 3.0 and 2.0 [java] 3 / 2=1.5 [java] 26-Mar-2008 12:56:20 org.apache.tuscany.sca.node.impl.NodeImpl stop [java] INFO: Stopping node: http://localhost:9990/node-config/NodeA Building And Running The Sample Using Maven ------------------------------------------- With either the binary or source distributions the sample can be built and run using Maven as follows. When running from Maven the four nodes all run within Java virtual machine. cd calculator-distributed mvn You should see the following output at the end of the test phase. INFO: Starting node: http://localhost:9990/node-config/NodeA CalculatorService - add 3.0 and 2.0 AddService - add 3.0 and 2.0 CalculatorService - subtract 3.0 and 2.0 SubtractService - subtract 3.0 and 2.0 CalculatorService - multiply 3.0 and 2.0 CalculatorService - divide 3.0 and 2.0 26-Mar-2008 13:00:52 org.apache.tuscany.sca.node.impl.NodeImpl stop INFO: Stopping node: http://localhost:9990/node-config/NodeC 26-Mar-2008 13:00:52 org.apache.tuscany.sca.node.impl.NodeImpl stop INFO: Stopping node: http://localhost:9990/node-config/NodeB 26-Mar-2008 13:00:52 org.apache.tuscany.sca.node.impl.NodeImpl stop INFO: Stopping node: http://localhost:9990/node-config/NodeA Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 13.328 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 This shows that the Junit test cases have run successfully.