1 /*
   2  * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.rmi.RemoteException;
  25 import java.rmi.registry.Registry;
  26 import java.rmi.registry.LocateRegistry;
  27 import java.util.logging.Logger;
  28 import java.util.logging.Level;
  29 
  30 /**
  31  * The ApplicationServer class provides the other server side of the "juicer"
  32  * stress test of RMI.
  33  */
  34 public class ApplicationServer implements Runnable {
  35 
  36     /** number of remote Apple objects to export */
  37     private static final Logger logger = Logger.getLogger("reliability.orange");
  38     private static final int LOOKUP_ATTEMPTS = 5;
  39     private static final int DEFAULT_NUMAPPLES = 10;
  40     private static final String DEFAULT_REGISTRYHOST = "localhost";
  41     private final int numApples;
  42     private final String registryHost;
  43     private final Apple[] apples;
  44     private AppleUser user;
  45 
  46     ApplicationServer() {
  47         this(DEFAULT_NUMAPPLES, DEFAULT_REGISTRYHOST);
  48     }
  49 
  50     ApplicationServer(int numApples, String registryHost) {
  51         this.numApples = numApples;
  52         this.registryHost = registryHost;
  53         apples = new Apple[numApples];
  54     }
  55 
  56     /*
  57      * On initialization, export remote objects and register
  58      * them with server.
  59      */
  60     public void run() {
  61         try {
  62             int i = 0;
  63 
  64             /*
  65              * Locate apple user object in registry.  The lookup will
  66              * occur until it is successful or fails LOOKUP_ATTEMPTS times.
  67              * These repeated attempts allow the ApplicationServer
  68              * to be started before the AppleUserImpl.
  69              */
  70             Exception exc = null;
  71             for (i = 0; i < LOOKUP_ATTEMPTS; i++) {
  72                 try {
  73                     Registry registry = LocateRegistry.getRegistry(
  74                         registryHost, 2006);
  75                     user = (AppleUser) registry.lookup("AppleUser");
  76                     user.startTest();
  77                     break; //successfully obtained AppleUser
  78                 } catch (Exception e) {
  79                     exc = e;
  80                     Thread.sleep(10000); //sleep 10 seconds and try again
  81                 }
  82             }
  83             if (user == null) {
  84                 logger.log(Level.SEVERE, "Failed to lookup AppleUser:", exc);
  85                 return;
  86             }
  87 
  88             /*
  89              * Create and export apple implementations.
  90              */
  91             try {
  92                 for (i = 0; i < numApples; i++) {
  93                     apples[i] = new AppleImpl("AppleImpl #" + (i + 1));
  94                 }
  95             } catch (RemoteException e) {
  96                 logger.log(Level.SEVERE,
  97                     "Failed to create AppleImpl #" + (i + 1) + ":", e);
  98                 user.reportException(e);
  99                 return;
 100             }
 101 
 102             /*
 103              * Hand apple objects to apple user.
 104              */
 105             try {
 106                 for (i = 0; i < numApples; i++) {
 107                     user.useApple(apples[i]);
 108                 }
 109             } catch (RemoteException e) {
 110                 logger.log(Level.SEVERE,
 111                     "Failed to register callbacks for " + apples[i] + ":", e);
 112                 user.reportException(e);
 113                 return;
 114             }
 115         } catch (Exception e) {
 116             logger.log(Level.SEVERE, "Unexpected exception:", e);
 117         }
 118     }
 119 
 120     private static void usage() {
 121         System.err.println("Usage: ApplicationServer [-numApples <numApples>]");
 122         System.err.println("                         [-registryHost <host>]");
 123         System.err.println("  numApples  The number of apples (threads) to use.");
 124         System.err.println("             The default is 10 apples.");
 125         System.err.println("  host       The host running rmiregistry " +
 126                                          "which contains AppleUser.");
 127         System.err.println("             The default is \"localhost\".");
 128         System.err.println();
 129     }
 130 
 131     public static void main(String[] args) {
 132         int num = DEFAULT_NUMAPPLES;
 133         String host = DEFAULT_REGISTRYHOST;
 134 
 135         // parse command line args
 136         try {
 137             for (int i = 0; i < args.length ; i++ ) {
 138                 String arg = args[i];
 139                 if (arg.equals("-numApples")) {
 140                     i++;
 141                     num = Integer.parseInt(args[i]);
 142                 } else if (arg.equals("-registryHost")) {
 143                     i++;
 144                     host = args[i];
 145                 } else {
 146                     usage();
 147                 }
 148             }
 149         } catch (Throwable t) {
 150             usage();
 151             throw new RuntimeException("TEST FAILED: Bad argument");
 152         }
 153 
 154         // start the client server
 155         Thread server = new Thread(new ApplicationServer(num,host));
 156         server.start();
 157         // main should exit once all exported remote objects are gc'd
 158     }
 159 }