
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1091912 13f79535-47bb-0310-9956-ffa450edef68
348 lines
12 KiB
Text
348 lines
12 KiB
Text
Store Tutorial
|
|
==============
|
|
|
|
This tutorial that shows how to use SCA and Tuscany to build multiple
|
|
variations of an online Store application. The variations demonstrate the
|
|
evolution of the Store as it goes through the following stages:
|
|
|
|
1 - Initial online fruit store
|
|
2 - Fruit store merges with vegetable store to form the fruit and vegetable store
|
|
3 - The fruit and vegetable store moves to using a database for storing the cart
|
|
4 - The fruit and vegetable store acts as a supplier to other online stores
|
|
5 - The fruit and vegetable store ships their software solution to another geography
|
|
6 - The fruit and vegetable store running in the enterprise
|
|
|
|
For diagrams of the scenarios covered here, please refer to Tutorial.pdf
|
|
|
|
Running The Tutorial Application
|
|
--------------------------------
|
|
|
|
If you're running the Store tutorial application for the first time since
|
|
downloading the Tuscany SCA Java binary distribution, you need to start by
|
|
running a setup step from the top-level store directory:
|
|
|
|
cd store
|
|
ant setup
|
|
|
|
You only need to do this once. It creates some database files that are used
|
|
by the tutorial application. If you forget to do it, you'll get errors when
|
|
running some of the scenarios.
|
|
|
|
Next, start the SCA Domain Manager:
|
|
|
|
cd domain
|
|
ant run
|
|
|
|
Alternatively, on linux:
|
|
|
|
cd domain
|
|
java -jar ../../../modules/tuscany-node-launcher-${pom.version}.jar domain
|
|
|
|
and on windows:
|
|
|
|
cd domain
|
|
java -jar ..\..\..\modules\tuscany-node-launcher-${pom.version}.jar domain
|
|
|
|
Access the SCA Domain Manager application by pointing your Web browser at:
|
|
|
|
http://localhost:9990/ui/cloud/
|
|
|
|
This shows you all of the Tuscany nodes that are configured to run
|
|
in the store tutorial domain. If you are interested, the configuration
|
|
is stored on disc in the store/domain directory but for now let's just
|
|
start some nodes and see what happens.
|
|
|
|
Starting nodes using the Domain Manager
|
|
---------------------------------------
|
|
|
|
The different nodes you see on the Cloud page are used to start different scenarios
|
|
in the tutorial. Select the node you want to start (e.g StoreNode), then click the
|
|
Start button. You may need to give the nodes a little time to start up. Check the
|
|
console where you lauched the domain manager application and you will see the
|
|
following message when nodes have started.
|
|
|
|
INFO: INFO: Press 'q' to quit, 'r' to restart.
|
|
|
|
Remember to shut down the nodes before you exit the domain manager application.
|
|
|
|
Starting nodes from the command line
|
|
------------------------------------
|
|
|
|
When you start nodes using the Domain Manager, the nodes run in the same process
|
|
as the Domain Manager. In some cases (e.g., debugging a node) it may be better
|
|
to start each node in its own separate process using the command line. This can
|
|
also be useful if you encounter problems with the Domain Manager becoming
|
|
unresponsive or hanging.
|
|
|
|
To start a node using the command line, open a separate command prompt for each
|
|
node that you want to start. At the command prompt, enter
|
|
|
|
cd domain
|
|
ant run<nodename>
|
|
|
|
You need to replace <nodename> by the name of the node that you are starting,
|
|
excluding the "Node" suffix. For example, to start StoreNode you would enter
|
|
|
|
ant runStore
|
|
|
|
When you start a node from the command line, the status column on the Cloud
|
|
page of the Domain Manager doesn't update and the status column still shows
|
|
the node as stopped even though it's running. This doesn't affect the correct
|
|
operation of the node. To shut down the node, enter 'q' at the command prompt.
|
|
|
|
Running the scenarios
|
|
---------------------
|
|
|
|
The following sections describe the nodes you need to start for each scenario
|
|
and give some useful links to explore once the node has started.
|
|
|
|
1 - Initial online fruit store
|
|
------------------------------
|
|
|
|
Start
|
|
|
|
StoreNode
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8100/ui/
|
|
|
|
If you want to look at how Tuscany provides remote bindings you can take
|
|
a look at the service description that Tuscany created automatically
|
|
for the store catalog service which is exposed over a JSONRPC binding
|
|
Point your browser at:
|
|
|
|
http://localhost:8100/StoreCatalog?smd
|
|
|
|
The service is configured in the SCA composite file in the following way:
|
|
|
|
<component name="StoreCatalog">
|
|
<implementation.java class="services.FruitsCatalogImpl"/>
|
|
<property name="currencyCode">USD</property>
|
|
<service name="Catalog">
|
|
<t:binding.jsonrpc/>
|
|
</service>
|
|
<reference name="currencyConverter" target="StoreCurrencyConverter"/>
|
|
</component>
|
|
|
|
Note the inclusion of <t:binding.jsonrpc/>. This is all that is required to
|
|
make this service available over JSONRPC. If you want to expose the service
|
|
over web services simply add <binding.ws/> instead of (or as well as) <t:binding.jsonrpc/>.
|
|
|
|
2 - Fruit store merges with vegetable store to form the fruit and vegetable store
|
|
---------------------------------------------------------------------------------
|
|
|
|
Start
|
|
|
|
CatalogsNode
|
|
StoreMergerNode
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8101/ui/
|
|
|
|
Now you see that there are more items in the catalog as the fruit and
|
|
vegetable catalogs are both providing content. The vegetable catalog
|
|
that was introduced during the merger is contacted using web services.
|
|
If you want to see the WSDL for the vegetable catalog point your browser
|
|
at
|
|
|
|
http://localhost:8200/VegetablesCatalogWebService?wsdl
|
|
|
|
The vegetable catalog service is configured in an SCA composite file
|
|
in the following way:
|
|
|
|
<component name="VegetablesCatalogWebService">
|
|
<implementation.java class="services.VegetablesCatalogImpl"/>
|
|
<service name="Catalog">
|
|
<binding.ws/>
|
|
</service>
|
|
</component>
|
|
|
|
3 - The fruit and vegetable store moves to using a database for storing the cart
|
|
--------------------------------------------------------------------------------
|
|
|
|
Start
|
|
|
|
CatalogsNode
|
|
StoreDBNode
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8102/ui/
|
|
|
|
If you see an error at this stage, this probably means you haven't done the
|
|
database setup mentioned in the section "Running The Tutorial Application".
|
|
|
|
This looks the same as the scenario 2 store but this time a database is used
|
|
for storing items put into the shopping cart. When you add items you
|
|
will see messages on the console indicating that items are added to the
|
|
database. For example.
|
|
|
|
INFO: insert into Cart values ('cart-8c8bcc43-5036-4e9a-b282-0dd3d00d350c', 'Apple', '$2.99')
|
|
|
|
This scenario shows how you change the implementation of a service without
|
|
changing any of the configuration of the rest of the application
|
|
|
|
4 - The fruit and vegetable store acts as a supplier to other online stores
|
|
---------------------------------------------------------------------------
|
|
|
|
Start
|
|
|
|
CatalogsNode
|
|
StoreSupplierNode
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8103/ui/
|
|
|
|
Again this is the same basic store as in scenario 3. However this time the
|
|
shopping cart and catalog services have been given additional remote bindings so that
|
|
the services can be accessed by others. For example, take a look at the WSDL
|
|
description of the shopping cart service that is now available at:
|
|
|
|
http://localhost:8333/ShoppinCartTotalWebService?wsdl
|
|
|
|
This WSDL is available as the shopping cart total service is now configured with a web services
|
|
binding in the following way:
|
|
|
|
<component name="StoreSupplierShoppingCart">
|
|
<implementation.java class="services.db.ShoppingCartTableImpl"/>
|
|
<property name="database">../store-supplier/target/cart-db</property>
|
|
<service name="Cart">
|
|
<t:binding.atom uri="/ShoppingCart/Cart"/>
|
|
</service>
|
|
<service name="Total">
|
|
<t:binding.jsonrpc/>
|
|
<binding.ws uri="/ShoppinCartTotalWebService"/>
|
|
</service>
|
|
</component>
|
|
|
|
If you want to actually exercise these services from a standalone application
|
|
you can run up the StoreClientNode by doing the following from a command prompt:
|
|
|
|
cd store-client
|
|
ant run
|
|
|
|
5 - The fruit and vegetable store ships their software solution to another geography
|
|
------------------------------------------------------------------------------------
|
|
|
|
Start
|
|
|
|
CatalogsNode
|
|
CurrencyNode
|
|
StoreEUNode
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8104/ui/
|
|
|
|
Notice now that the prices are quoted in Euros and the language is French. This was
|
|
achieved by editing the store.html file to change the language and presentation to
|
|
be appropriate for Europe. The currency was changed by reconfiguring the catalog
|
|
component to use EUR instead of USD.
|
|
|
|
<component name="StoreEUCatalog">
|
|
<implementation.java class="services.merger.MergedCatalogImpl"/>
|
|
<property name="currencyCode">EUR</property>
|
|
...
|
|
</component>
|
|
|
|
6 - The fruit and vegetable store running in the enterprise
|
|
-----------------------------------------------------------
|
|
|
|
Start
|
|
|
|
CatalogsNode
|
|
StoreEnterpriseNode
|
|
|
|
Separately run from a command prompt:
|
|
|
|
cd domain
|
|
ant runWarehouseSpring
|
|
|
|
This runs a launcher program which starts the node for the warehouse based on local
|
|
configuration. It doesn't use the domain manager like the other nodes we started.
|
|
It also starts an ActiveMQ broker via which JMS messages will pass.
|
|
|
|
The store itself can be found at
|
|
|
|
http://localhost:8108/ui/
|
|
|
|
The items in the catalog are much the same as the previous examples.
|
|
This time though when you place the order a message is sent over JMS to
|
|
the warehouse component running outside the domain and listening on JMS.
|
|
In this case we have implemented the warehouse application using SCA and it
|
|
has its own UI. The UI can be found at
|
|
|
|
http://localhost:8088/ui/
|
|
|
|
If you press the Refresh button, you should see the orders accumulating.
|
|
You can't do anything with the orders but it is just a demo.
|
|
|
|
The warehouse component is configured in the composite file in the following way:
|
|
|
|
<component name="Warehouse">
|
|
<implementation.java class="services.WarehouseImpl"/>
|
|
<service name="Warehouse">
|
|
<t:binding.jsonrpc uri="http://localhost:8088/Warehouse"/>
|
|
<binding.jms initialContextFactory="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
|
|
jndiURL="tcp://localhost:61619">
|
|
<destination name="RequestQueue" create="ifnotexist"/>
|
|
<response>
|
|
<destination name="ResponseQueue" create="ifnotexist"/>
|
|
</response>
|
|
</binding.jms>
|
|
</service>
|
|
</component>
|
|
|
|
And the shopping cart component that talks to it is configured as follows
|
|
|
|
<component name="StoreEnterpriseShoppingCart">
|
|
<implementation.java class="services.ShoppingCartImpl"/>
|
|
<service name="Cart">
|
|
<t:binding.atom uri="/ShoppingCart/Cart"/>
|
|
</service>
|
|
<service name="Total">
|
|
<t:binding.jsonrpc/>
|
|
</service>
|
|
<reference name="warehouse" multiplicity="0..1" >
|
|
<binding.jms initialContextFactory="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
|
|
jndiURL="tcp://localhost:61619">
|
|
<destination name="RequestQueue" create="always"/>
|
|
<response>
|
|
<destination name="ResponseQueue" create="always"/>
|
|
</response>
|
|
</binding.jms>
|
|
</reference>
|
|
</component>
|
|
|
|
|
|
For more detailed information about how to get started with Apache Tuscany
|
|
see our online guides at:
|
|
|
|
http://tuscany.apache.org/sca-java-getting-started-guides-1x.html
|
|
|
|
|
|
Building the Store Tutorial Using Ant
|
|
-------------------------------------
|
|
With the binary distribution the complete store tutorial can be built using Ant
|
|
as follows:
|
|
|
|
cd store
|
|
ant compile
|
|
|
|
This also creates the database files that were mentioned in the section
|
|
"Running The Tutorial Application".
|
|
|
|
|
|
Building the Store Tutorial Using Maven
|
|
---------------------------------------
|
|
With either the binary or source distribution the complete store tutorial can
|
|
be built using Maven as follows:
|
|
|
|
cd store
|
|
mvn
|
|
|
|
This also creates the database files that were mentioned in the section
|
|
"Running The Tutorial Application".
|