ApplicationServer.java revision 0
0N/A/*
1879N/A * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
1472N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
1472N/A * CA 95054 USA or visit www.sun.com if you need additional information or
1472N/A * have any questions.
0N/A */
0N/A
0N/Aimport java.rmi.RemoteException;
1879N/Aimport java.rmi.registry.Registry;
1879N/Aimport java.rmi.registry.LocateRegistry;
1879N/Aimport java.util.logging.Logger;
0N/Aimport java.util.logging.Level;
0N/A
0N/A/**
0N/A * The ApplicationServer class provides the other server side of the "juicer"
0N/A * stress test of RMI.
0N/A */
0N/Apublic class ApplicationServer implements Runnable {
0N/A
0N/A /** number of remote Apple objects to export */
0N/A private static final Logger logger = Logger.getLogger("reliability.orange");
0N/A private static final int LOOKUP_ATTEMPTS = 5;
0N/A private static final int DEFAULT_NUMAPPLES = 10;
0N/A private static final String DEFAULT_REGISTRYHOST = "localhost";
0N/A private final int numApples;
0N/A private final String registryHost;
0N/A private final Apple[] apples;
0N/A private AppleUser user;
0N/A
0N/A ApplicationServer() {
0N/A this(DEFAULT_NUMAPPLES, DEFAULT_REGISTRYHOST);
0N/A }
0N/A
0N/A ApplicationServer(int numApples, String registryHost) {
0N/A this.numApples = numApples;
0N/A this.registryHost = registryHost;
0N/A apples = new Apple[numApples];
0N/A }
0N/A
0N/A /*
0N/A * On initialization, export remote objects and register
0N/A * them with server.
0N/A */
0N/A public void run() {
0N/A try {
0N/A int i = 0;
0N/A
/*
* Locate apple user object in registry. The lookup will
* occur until it is successful or fails LOOKUP_ATTEMPTS times.
* These repeated attempts allow the ApplicationServer
* to be started before the AppleUserImpl.
*/
Exception exc = null;
for (i = 0; i < LOOKUP_ATTEMPTS; i++) {
try {
Registry registry = LocateRegistry.getRegistry(
registryHost, 2006);
user = (AppleUser) registry.lookup("AppleUser");
user.startTest();
break; //successfully obtained AppleUser
} catch (Exception e) {
exc = e;
Thread.sleep(10000); //sleep 10 seconds and try again
}
}
if (user == null) {
logger.log(Level.SEVERE, "Failed to lookup AppleUser:", exc);
return;
}
/*
* Create and export apple implementations.
*/
try {
for (i = 0; i < numApples; i++) {
apples[i] = new AppleImpl("AppleImpl #" + (i + 1));
}
} catch (RemoteException e) {
logger.log(Level.SEVERE,
"Failed to create AppleImpl #" + (i + 1) + ":", e);
user.reportException(e);
return;
}
/*
* Hand apple objects to apple user.
*/
try {
for (i = 0; i < numApples; i++) {
user.useApple(apples[i]);
}
} catch (RemoteException e) {
logger.log(Level.SEVERE,
"Failed to register callbacks for " + apples[i] + ":", e);
user.reportException(e);
return;
}
} catch (Exception e) {
logger.log(Level.SEVERE, "Unexpected exception:", e);
}
}
private static void usage() {
System.err.println("Usage: ApplicationServer [-numApples <numApples>]");
System.err.println(" [-registryHost <host>]");
System.err.println(" numApples The number of apples (threads) to use.");
System.err.println(" The default is 10 apples.");
System.err.println(" host The host running rmiregistry " +
"which contains AppleUser.");
System.err.println(" The default is \"localhost\".");
System.err.println();
}
public static void main(String[] args) {
int num = DEFAULT_NUMAPPLES;
String host = DEFAULT_REGISTRYHOST;
// parse command line args
try {
for (int i = 0; i < args.length ; i++ ) {
String arg = args[i];
if (arg.equals("-numApples")) {
i++;
num = Integer.parseInt(args[i]);
} else if (arg.equals("-registryHost")) {
i++;
host = args[i];
} else {
usage();
}
}
} catch (Throwable t) {
usage();
throw new RuntimeException("TEST FAILED: Bad argument");
}
// start the client server
Thread server = new Thread(new ApplicationServer(num,host));
server.start();
// main should exit once all exported remote objects are gc'd
}
}