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 <init | |
> | |
[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 <init | |
> | |
[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 <init | |
> | |
[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. | |