You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by gt...@apache.org on 2015/02/06 23:55:01 UTC

svn commit: r1657985 - in /river/river-examples/river-examples/trunk: ./ src/site/markdown/ src/site/markdown/browser/ src/site/markdown/hello-client/ src/site/markdown/hello-service/ src/site/markdown/infrastructure/ src/site/resources/hello-client/

Author: gtrasuk
Date: Fri Feb  6 22:55:01 2015
New Revision: 1657985

URL: http://svn.apache.org/r1657985
Log:
The set of examples is complete, including the client.  To use the project, follow the instructions starting in README.md.

Added:
    river/river-examples/river-examples/trunk/README.md
    river/river-examples/river-examples/trunk/src/site/markdown/hello-client/
    river/river-examples/river-examples/trunk/src/site/markdown/hello-client/hello-client.md
    river/river-examples/river-examples/trunk/src/site/resources/hello-client/
    river/river-examples/river-examples/trunk/src/site/resources/hello-client/Client-run.png   (with props)
Modified:
    river/river-examples/river-examples/trunk/pom.xml
    river/river-examples/river-examples/trunk/src/site/markdown/browser/browser.md
    river/river-examples/river-examples/trunk/src/site/markdown/hello-service/hello-service.md
    river/river-examples/river-examples/trunk/src/site/markdown/index.md
    river/river-examples/river-examples/trunk/src/site/markdown/infrastructure/infrastructure.md

Added: river/river-examples/river-examples/trunk/README.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/README.md?rev=1657985&view=auto
==============================================================================
--- river/river-examples/river-examples/trunk/README.md (added)
+++ river/river-examples/river-examples/trunk/README.md Fri Feb  6 22:55:01 2015
@@ -0,0 +1,43 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+
+Apache River Examples - README
+=====================
+
+This project contains a set of examples that show how to use Apache River.
+
+## Building the examples
+
+The project uses Apache Maven to manage the dependencies and build the examples.
+There is no need to download and build the main River distribution or tools;
+the River artifacts are deployed to Maven Central, so Maven will automatically
+download the binary artifacts as needed for the examples build.
+
+You'll need Apache Maven installed.  See [Apache Maven](http://maven.apache.org).
+
+To build the examples, simply unpack the source distribution of 'river-examples',
+and then,
+
+    cd river-examples
+    mvn install
+    mvn site
+
+Once the site is built, please read the project documentation at 
+[target/site/index.html](target/site/index.html).
+

Modified: river/river-examples/river-examples/trunk/pom.xml
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/pom.xml?rev=1657985&r1=1657984&r2=1657985&view=diff
==============================================================================
--- river/river-examples/river-examples/trunk/pom.xml (original)
+++ river/river-examples/river-examples/trunk/pom.xml Fri Feb  6 22:55:01 2015
@@ -129,5 +129,6 @@
     <module>home</module>
     <module>hello-api</module>
     <module>hello-service</module>
+    <module>hello-client</module>
   </modules>
 </project>
\ No newline at end of file

Modified: river/river-examples/river-examples/trunk/src/site/markdown/browser/browser.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/markdown/browser/browser.md?rev=1657985&r1=1657984&r2=1657985&view=diff
==============================================================================
--- river/river-examples/river-examples/trunk/src/site/markdown/browser/browser.md (original)
+++ river/river-examples/river-examples/trunk/src/site/markdown/browser/browser.md Fri Feb  6 22:55:01 2015
@@ -63,7 +63,9 @@ object.
 
 * Speaking of the codebase annotation, the bytecode for a proxy has to be downloadable
 from somewhere.  This could certainly be a standard web server like Tomcat, but it 
-does need to be setup.  And the codebase annotation has to point to it.
+does need to be setup.  And the codebase annotation has to point to it. And in general, we have
+to enable code downloading by setting the system property "java.rmi.server.useCodebaseOnly"
+to "false".
 
 It is (barely) possible to configure a JRE and setup the policy files using command-line
 options to the JDK, but there's an easier way: The ServiceStarter container.
@@ -71,7 +73,7 @@ options to the JDK, but there's an easie
 So the way that we "run" the service browser is to run the ServiceStarter container with 
 a setup file that instructs it how to run the browser program that we're really interested in.
 
-    java -Djava.security.manager -Djava.security.policy=server.policy -jar lib/start.jar start-browser.config
+    java -Djava.security.manager -Djava.security.policy=server.policy -Djava.rmi.server.useCodebaseOnly=false -jar lib/start.jar start-browser.config
 
 If all is well, you should see the Service Browser start up, with a window that looks like this:
 

Added: river/river-examples/river-examples/trunk/src/site/markdown/hello-client/hello-client.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/markdown/hello-client/hello-client.md?rev=1657985&view=auto
==============================================================================
--- river/river-examples/river-examples/trunk/src/site/markdown/hello-client/hello-client.md (added)
+++ river/river-examples/river-examples/trunk/src/site/markdown/hello-client/hello-client.md Fri Feb  6 22:55:01 2015
@@ -0,0 +1,146 @@
+# The Hello Client
+
+Finally, we are ready to code a service consumer, also known as a client.
+
+To summarize, so far, we've done the following:
+
+- Started a service browser so we can see what's on the network in our djinn.  
+- Started up a service registrar.  
+- Started up a "hello-world" service.  
+
+By now, the pattern should be coming clear - we run Jini components inside a 
+container that is setup by the "service starter" framework.  This container handles
+the details of setting up the class loaders and the dynamic security policy provider.
+We configure this container with a "start-xyz.config" file.  The component itself
+loads up its configuration from a "xyz.config" file.
+
+So let's finish it off by looking at the client.  The code part is in the module
+"hello-client" inside the examples project.  The main code is in the class
+"org.apache.river.examples.hello.client.App":
+
+    public class App {
+
+        private static final String MODULE=App.class.getPackage().getName();
+
+        public App(final String[] args, LifeCycle lc) {
+            main(args);
+        }
+
+        public static synchronized void main(String[] args) {
+            try {
+                // Get the config
+                Configuration config = ConfigurationProvider.getInstance(args);
+                // From the config, get the ServiceDiscoveryManager
+                ServiceDiscoveryManager sdm=
+                        (ServiceDiscoveryManager) 
+                        config.getEntry(MODULE, "sdm", ServiceDiscoveryManager.class);
+                // We'll also need a proxy preparer.
+                ProxyPreparer preparer=(ProxyPreparer) config.getEntry(MODULE, 
+                        "greeterPreparer", ProxyPreparer.class);
+                // While the sdm is finding registrars, let's ask the user for their
+                // name.
+                Scanner in = new Scanner(System.in);
+                System.out.println("Please enter your name:");
+                String name = in.nextLine();
+                // Query the sdm for Greeter services.
+                ServiceTemplate template=new ServiceTemplate(
+                        null,
+                        new Class[] { Greeter.class },
+                        new Entry[0]
+                );
+                ServiceItem[] serviceItems=sdm.lookup(template, 5, null);
+                if (serviceItems.length==0) {
+                    System.out.println("We didn't find any greeter services.");
+                    System.exit(0);
+                }
+                // Pick a service item
+                ServiceItem chosen=serviceItems[0];
+                // Prepare the proxy.
+                Greeter greeter=(Greeter) preparer.prepareProxy(chosen.service);
+                // Make the call
+                String message=greeter.sayHello(name);
+                // Print the result
+                System.out.println("Greeter replied '" + message + "'.");
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            } finally {
+                System.exit(0);
+            }
+        }
+    }
+
+The only thing that looks a little funny is that we call the main(...) method
+from the constructor.  This quirk is because of the way the ServiceStarter works, by 
+instantiating the object.
+
+Apart from that, we can see the usual pattern of getting a Configuration object based
+on the command-line parameters, and pulling entries out of the configuration.  In this case,
+the program shows the basic pattern for using a service:
+
+1 - Get a ServiceDiscoveryManager from the configuration.  Inside the configuration, the
+ServiceDiscoveryManager is configured to use a LookupDiscoveryManager to find all the service 
+registrars that appear on the network.  
+2 - Use the ServiceDiscoveryManager to look up the service itself.  Note that we lookup the
+service by its interface, as defined in the API module.  
+3 - Select a proxy (in this case, we simply use the first one we find), and prepare it
+using a ProxyPreparer.  
+4 - Invoke methods on the proxy, which in turn communicates with the real service.
+
+The configuration for the client is as follows:
+
+    org.apache.river.examples.hello.client {
+
+        discoveryGroup="example-group";
+
+        groups = new String[] {discoveryGroup};
+
+        exporter = new BasicJeriExporter(TcpServerEndpoint.getInstance(0),
+                                         new BasicILFactory());
+
+        serviceInvocationConstraints=InvocationConstraints.EMPTY;
+
+        basicPreparer = 
+            new BasicProxyPreparer(false, new BasicMethodConstraints(serviceInvocationConstraints),
+                new Permission[] { new RuntimePermission("accessClassInPackage.com.sun.proxy") } );
+
+        static discoveryManager = 
+            new LookupDiscovery( groups, this);
+
+        greeterPreparer = basicPreparer;
+        registrarPreparer = basicPreparer;
+
+        static sdm = new ServiceDiscoveryManager(discoveryManager, null);
+
+    }
+
+And the 'starter' configuration is:
+
+    com.sun.jini.start {
+
+        private static policy = "server.policy";
+        private static classpath = "lib${/}hello-api.jar:lib${/}hello-client.jar";
+        private static config = "hello-client.config";
+        private static codebase="";
+
+        static serviceDescriptors = new ServiceDescriptor[] {
+            new NonActivatableServiceDescriptor(
+                codebase, policy, classpath,
+                "org.apache.river.examples.hello.client.App",
+                new String[] { config })
+        };
+
+    }//com.sun.jini.start
+
+Finally, run the client:
+
+    java -Djava.security.manager -Djava.security.policy=server.policy -Djava.rmi.server.useCodebaseOnly=false -jar lib/start.jar start-hello-client.config
+
+The client will ask you to enter your name on the command line, and then call the
+service's 'sayHello(..)' method, and print out the results.
+
+![Running the client](Client-run.png)
+
+Now, for extra points, copy the 'home' binary to another machine that has Java 
+installed, and run the client.  You should see that it still works, with no real
+configuration other than the name of the discovery group.
+

Modified: river/river-examples/river-examples/trunk/src/site/markdown/hello-service/hello-service.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/markdown/hello-service/hello-service.md?rev=1657985&r1=1657984&r2=1657985&view=diff
==============================================================================
--- river/river-examples/river-examples/trunk/src/site/markdown/hello-service/hello-service.md (original)
+++ river/river-examples/river-examples/trunk/src/site/markdown/hello-service/hello-service.md Fri Feb  6 22:55:01 2015
@@ -283,7 +283,7 @@ that's built by the 'home' module:
 
 and then execute the service-starter with the required configuration file:
 
-    java -Djava.security.manager -Djava.security.policy=server.policy -jar lib/start.jar start-hello-service.config
+    java -Djava.security.manager -Djava.security.policy=server.policy -Djava.rmi.server.useCodebaseOnly=false -jar lib/start.jar start-hello-service.config
 
 You should see the service start up:  
 ![Hello service start-up](hello-service-cmd.png)

Modified: river/river-examples/river-examples/trunk/src/site/markdown/index.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/markdown/index.md?rev=1657985&r1=1657984&r2=1657985&view=diff
==============================================================================
--- river/river-examples/river-examples/trunk/src/site/markdown/index.md (original)
+++ river/river-examples/river-examples/trunk/src/site/markdown/index.md Fri Feb  6 22:55:01 2015
@@ -77,3 +77,8 @@ Application Programming Interface...
 
 [Read More...](hello-service/hello-service.html)
 
+## The Hello Client
+
+Finally, we are ready to code a service consumer, also known as a client.
+
+[Read More...](hello-client/hello-client.html)

Modified: river/river-examples/river-examples/trunk/src/site/markdown/infrastructure/infrastructure.md
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/markdown/infrastructure/infrastructure.md?rev=1657985&r1=1657984&r2=1657985&view=diff
==============================================================================
--- river/river-examples/river-examples/trunk/src/site/markdown/infrastructure/infrastructure.md (original)
+++ river/river-examples/river-examples/trunk/src/site/markdown/infrastructure/infrastructure.md Fri Feb  6 22:55:01 2015
@@ -23,7 +23,7 @@ single point of failure.
 In any case, in order to show a simple client and service, we'll need a service registrar.
 There's another configuration provided in the examples 'home' module, which we can run as below:
 
-    java -Djava.security.manager -Djava.security.policy=server.policy -jar lib/start.jar start-infra.config
+    java -Djava.security.manager -Djava.security.policy=server.policy -Djava.rmi.server.useCodebaseOnly=false -jar lib/start.jar start-infra.config
 
 If you run this command line, and you still have your service browser open from the 
 previous section, you should see a registrar appear in the browser, like so:

Added: river/river-examples/river-examples/trunk/src/site/resources/hello-client/Client-run.png
URL: http://svn.apache.org/viewvc/river/river-examples/river-examples/trunk/src/site/resources/hello-client/Client-run.png?rev=1657985&view=auto
==============================================================================
Binary file - no diff available.

Propchange: river/river-examples/river-examples/trunk/src/site/resources/hello-client/Client-run.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream