summaryrefslogtreecommitdiff
path: root/java-compat/src
diff options
context:
space:
mode:
Diffstat (limited to 'java-compat/src')
-rw-r--r--java-compat/src/IceBox/src/main/java/IceBox/Admin.java262
-rw-r--r--java-compat/src/IceBox/src/main/java/IceBox/Server.java128
-rw-r--r--java-compat/src/IceBox/src/main/java/IceBox/ServiceManagerI.java9
3 files changed, 232 insertions, 167 deletions
diff --git a/java-compat/src/IceBox/src/main/java/IceBox/Admin.java b/java-compat/src/IceBox/src/main/java/IceBox/Admin.java
index 515cf8055f1..4701f24f495 100644
--- a/java-compat/src/IceBox/src/main/java/IceBox/Admin.java
+++ b/java-compat/src/IceBox/src/main/java/IceBox/Admin.java
@@ -11,174 +11,192 @@ package IceBox;
public final class Admin
{
- private static class Client extends Ice.Application
+ static class ShutdownHook implements Runnable
{
- private void
- usage()
+ private Ice.Communicator communicator;
+
+ ShutdownHook(Ice.Communicator communicator)
{
- System.err.println(
- "Usage: " + appName() + " [options] [command...]\n" +
- "Options:\n" +
- "-h, --help Show this message.\n" +
- "\n" +
- "Commands:\n" +
- "start SERVICE Start a service.\n" +
- "stop SERVICE Stop a service.\n" +
- "shutdown Shutdown the server.");
+ this.communicator = communicator;
}
@Override
- public int
- run(String[] args)
+ public void
+ run()
{
- java.util.List<String> commands = new java.util.ArrayList<String>();
+ communicator.destroy();
+ }
+ }
- int idx = 0;
- while(idx < args.length)
+ private static void
+ usage()
+ {
+ System.err.println(
+ "Usage: IceBox.Admin [options] [command...]\n" +
+ "Options:\n" +
+ "-h, --help Show this message.\n" +
+ "\n" +
+ "Commands:\n" +
+ "start SERVICE Start a service.\n" +
+ "stop SERVICE Stop a service.\n" +
+ "shutdown Shutdown the server.");
+ }
+
+ public static void
+ main(String[] args)
+ {
+ int status = 0;
+ Ice.StringSeqHolder argHolder = new Ice.StringSeqHolder(args);
+
+ try(Ice.Communicator communicator = Ice.Util.initialize(argHolder))
+ {
+ Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(communicator)));
+
+ java.util.List<String> commands = new java.util.ArrayList<String>(java.util.Arrays.asList(argHolder.value));
+
+ for(String command : commands)
{
- if(args[idx].equals("-h") || args[idx].equals("--help"))
+ if(command.equals("-h") || command.equals("--help"))
{
usage();
- return 1;
+ status = 1;
+ break;
}
- else if(args[idx].charAt(0) == '-')
+ else if(command.charAt(0) == '-')
{
- System.err.println(appName() + ": unknown option `" + args[idx] + "'");
+ System.err.println("IceBox.Admin: unknown option `" + command + "'");
usage();
- return 1;
- }
- else
- {
- commands.add(args[idx]);
- ++idx;
+ status = 1;
+ break;
}
}
if(commands.isEmpty())
{
usage();
- return 0;
+ status = 0;
}
+ else if(status == 0)
+ {
+ status = run(communicator, commands);
+ }
+ }
+
+ System.exit(status);
+ }
- Ice.ObjectPrx base = communicator().propertyToProxy("IceBoxAdmin.ServiceManager.Proxy");
+ public static int
+ run(Ice.Communicator communicator, java.util.List<String> commands)
+ {
+ Ice.ObjectPrx base = communicator.propertyToProxy("IceBoxAdmin.ServiceManager.Proxy");
- if(base == null)
- {
- //
- // The old deprecated way to retrieve the service manager proxy
- //
+ if(base == null)
+ {
+ //
+ // The old deprecated way to retrieve the service manager proxy
+ //
- Ice.Properties properties = communicator().getProperties();
+ Ice.Properties properties = communicator.getProperties();
- Ice.Identity managerIdentity = new Ice.Identity();
- managerIdentity.category = properties.getPropertyWithDefault("IceBox.InstanceName", "IceBox");
- managerIdentity.name = "ServiceManager";
+ Ice.Identity managerIdentity = new Ice.Identity();
+ managerIdentity.category = properties.getPropertyWithDefault("IceBox.InstanceName", "IceBox");
+ managerIdentity.name = "ServiceManager";
- String managerProxy;
- if(properties.getProperty("Ice.Default.Locator").length() == 0)
+ String managerProxy;
+ if(properties.getProperty("Ice.Default.Locator").length() == 0)
+ {
+ String managerEndpoints = properties.getProperty("IceBox.ServiceManager.Endpoints");
+ if(managerEndpoints.length() == 0)
{
- String managerEndpoints = properties.getProperty("IceBox.ServiceManager.Endpoints");
- if(managerEndpoints.length() == 0)
- {
- System.err.println(appName() + ": property `IceBoxAdmin.ServiceManager.Proxy' is not set");
- return 1;
- }
-
- managerProxy = "\"" + communicator().identityToString(managerIdentity) + "\" :" + managerEndpoints;
+ System.err.println("IceBox.Admin: property `IceBoxAdmin.ServiceManager.Proxy' is not set");
+ return 1;
}
- else
+
+ managerProxy = "\"" + communicator.identityToString(managerIdentity) + "\" :" + managerEndpoints;
+ }
+ else
+ {
+ String managerAdapterId = properties.getProperty("IceBox.ServiceManager.AdapterId");
+ if(managerAdapterId.length() == 0)
{
- String managerAdapterId = properties.getProperty("IceBox.ServiceManager.AdapterId");
- if(managerAdapterId.length() == 0)
- {
- System.err.println(appName() + ": property `IceBoxAdmin.ServiceManager.Proxy' is not set");
- return 1;
- }
-
- managerProxy = "\"" + communicator().identityToString(managerIdentity) + "\" @" + managerAdapterId;
+ System.err.println("IceBox.Admin: property `IceBoxAdmin.ServiceManager.Proxy' is not set");
+ return 1;
}
- base = communicator().stringToProxy(managerProxy);
+ managerProxy = "\"" + communicator.identityToString(managerIdentity) + "\" @" + managerAdapterId;
}
- IceBox.ServiceManagerPrx manager = IceBox.ServiceManagerPrxHelper.checkedCast(base);
- if(manager == null)
+ base = communicator.stringToProxy(managerProxy);
+ }
+
+ IceBox.ServiceManagerPrx manager = IceBox.ServiceManagerPrxHelper.checkedCast(base);
+ if(manager == null)
+ {
+ System.err.println("IceBox.Admin: `" + base.toString() + "' is not an IceBox::ServiceManager");
+ return 1;
+ }
+
+ for(int i = 0; i < commands.size(); i++)
+ {
+ String command = commands.get(i);
+ if(command.equals("shutdown"))
{
- System.err.println(appName() + ": `" + base.toString() + "' is not an IceBox::ServiceManager");
- return 1;
+ manager.shutdown();
}
-
- for(int i = 0; i < commands.size(); i++)
+ else if(command.equals("start"))
{
- String command = commands.get(i);
- if(command.equals("shutdown"))
+ if(++i >= commands.size())
+ {
+ System.err.println("IceBox.Admin: no service name specified.");
+ return 1;
+ }
+
+ String service = commands.get(i);
+ try
{
- manager.shutdown();
+ manager.startService(service);
}
- else if(command.equals("start"))
+ catch(IceBox.NoSuchServiceException ex)
{
- if(++i >= commands.size())
- {
- System.err.println(appName() + ": no service name specified.");
- return 1;
- }
-
- String service = commands.get(i);
- try
- {
- manager.startService(service);
- }
- catch(IceBox.NoSuchServiceException ex)
- {
- System.err.println(appName() + ": unknown service `" + service + "'");
- return 1;
- }
- catch(IceBox.AlreadyStartedException ex)
- {
- System.err.println(appName() + "service already started.");
- }
+ System.err.println("IceBox.Admin: unknown service `" + service + "'");
+ return 1;
}
- else if(command.equals("stop"))
+ catch(IceBox.AlreadyStartedException ex)
{
- if(++i >= commands.size())
- {
- System.err.println(appName() + ": no service name specified.");
- return 1;
- }
-
- String service = commands.get(i);
- try
- {
- manager.stopService(service);
- }
- catch(IceBox.NoSuchServiceException ex)
- {
- System.err.println(appName() + ": unknown service `" + service + "'");
- return 1;
- }
- catch(IceBox.AlreadyStoppedException ex)
- {
- System.err.println(appName() + "service already stopped.");
- }
+ System.err.println("IceBox.Admin: service already started.");
}
- else
+ }
+ else if(command.equals("stop"))
+ {
+ if(++i >= commands.size())
{
- System.err.println(appName() + ": unknown command `" + command + "'");
- usage();
+ System.err.println("IceBox.Admin: no service name specified.");
return 1;
}
- }
- return 0;
+ String service = commands.get(i);
+ try
+ {
+ manager.stopService(service);
+ }
+ catch(IceBox.NoSuchServiceException ex)
+ {
+ System.err.println("IceBox.Admin: unknown service `" + service + "'");
+ return 1;
+ }
+ catch(IceBox.AlreadyStoppedException ex)
+ {
+ System.err.println("IceBox.Admin: service already stopped.");
+ }
+ }
+ else
+ {
+ System.err.println("IceBox.Admin: unknown command `" + command + "'");
+ usage();
+ return 1;
+ }
}
- }
-
- public static void
- main(String[] args)
- {
- Client app = new Client();
- int rc = app.main("IceBox.Admin", args);
- System.exit(rc);
+ return 0;
}
}
diff --git a/java-compat/src/IceBox/src/main/java/IceBox/Server.java b/java-compat/src/IceBox/src/main/java/IceBox/Server.java
index 06f4996c7b7..0a129f82797 100644
--- a/java-compat/src/IceBox/src/main/java/IceBox/Server.java
+++ b/java-compat/src/IceBox/src/main/java/IceBox/Server.java
@@ -9,8 +9,56 @@
package IceBox;
-public final class Server extends Ice.Application
+public final class Server
{
+ static class ShutdownHook extends Thread
+ {
+ private Ice.Communicator _communicator;
+ private final java.lang.Object _doneMutex = new java.lang.Object();
+ private boolean _done = false;
+
+ ShutdownHook(Ice.Communicator communicator)
+ {
+ _communicator = communicator;
+ }
+
+ @Override
+ public void
+ run()
+ {
+ _communicator.shutdown();
+
+ synchronized(_doneMutex)
+ {
+ //
+ // Wait on the server to finish shutting down before exiting the ShutdownHook. This ensures
+ // that all IceBox services have had a chance to shutdown cleanly before the JVM terminates.
+ //
+ while(!_done)
+ {
+ try
+ {
+ _doneMutex.wait();
+ }
+ catch(InterruptedException ex)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ public void
+ done()
+ {
+ synchronized(_doneMutex)
+ {
+ _done = true;
+ _doneMutex.notify();
+ }
+ }
+ }
+
private static void
usage()
{
@@ -24,56 +72,64 @@ public final class Server extends Ice.Application
public static void
main(String[] args)
{
+ int status = 0;
+ Ice.StringSeqHolder argHolder = new Ice.StringSeqHolder(args);
+
Ice.InitializationData initData = new Ice.InitializationData();
initData.properties = Ice.Util.createProperties();
initData.properties.setProperty("Ice.Admin.DelayCreation", "1");
+ ShutdownHook shutdownHook = null;
- Server server = new Server();
- System.exit(server.main("IceBox.Server", args, initData));
- }
-
- @Override
- public int
- run(String[] args)
- {
- final String prefix = "IceBox.Service.";
- Ice.Properties properties = communicator().getProperties();
- java.util.Map<String, String> services = properties.getPropertiesForPrefix(prefix);
- java.util.List<String> argSeq = new java.util.ArrayList<String>(args.length);
- for(String s : args)
+ try(Ice.Communicator communicator = Ice.Util.initialize(argHolder, initData))
{
- argSeq.add(s);
- }
+ shutdownHook = new ShutdownHook(communicator);
+ Runtime.getRuntime().addShutdownHook(shutdownHook);
- for(java.util.Map.Entry<String, String> entry : services.entrySet())
- {
- String name = entry.getKey().substring(prefix.length());
- for(int i = 0; i < argSeq.size(); ++i)
+ final String prefix = "IceBox.Service.";
+ Ice.Properties properties = communicator.getProperties();
+ java.util.Map<String, String> services = properties.getPropertiesForPrefix(prefix);
+
+ for(String arg : argHolder.value)
{
- if(argSeq.get(i).startsWith("--" + name))
+ boolean valid = false;
+ for(java.util.Map.Entry<String, String> entry : services.entrySet())
+ {
+ String name = entry.getKey().substring(prefix.length());
+ if(arg.startsWith("--" + name))
+ {
+ valid = true;
+ break;
+ }
+ }
+ if(!valid)
{
- argSeq.remove(i);
- i--;
+ if(arg.equals("-h") || arg.equals("--help"))
+ {
+ usage();
+ status = 1;
+ break;
+ }
+ else
+ {
+ System.err.println("IceBox.Server: unknown option `" + arg + "'");
+ usage();
+ status = 1;
+ break;
+ }
}
}
- }
- for(String arg : argSeq)
+ ServiceManagerI serviceManagerImpl = new ServiceManagerI(communicator, argHolder.value);
+ status = serviceManagerImpl.run();
+ }
+ finally
{
- if(arg.equals("-h") || arg.equals("--help"))
- {
- usage();
- return 0;
- }
- else
+ if(shutdownHook != null)
{
- System.err.println("Server: unknown option `" + arg + "'");
- usage();
- return 1;
+ shutdownHook.done();
}
}
- ServiceManagerI serviceManagerImpl = new ServiceManagerI(communicator(), args);
- return serviceManagerImpl.run();
+ System.exit(status);
}
}
diff --git a/java-compat/src/IceBox/src/main/java/IceBox/ServiceManagerI.java b/java-compat/src/IceBox/src/main/java/IceBox/ServiceManagerI.java
index 670a63f1909..42eedb3d490 100644
--- a/java-compat/src/IceBox/src/main/java/IceBox/ServiceManagerI.java
+++ b/java-compat/src/IceBox/src/main/java/IceBox/ServiceManagerI.java
@@ -430,14 +430,6 @@ public class ServiceManagerI extends _ServiceManagerDisp
}
//
- // Don't move after the adapter activation. This allows
- // applications to wait for the service manager to be
- // reachable before sending a signal to shutdown the
- // IceBox.
- //
- Ice.Application.shutdownOnInterrupt();
-
- //
// Register "this" as a facet to the Admin object and
// create Admin object
//
@@ -471,7 +463,6 @@ public class ServiceManagerI extends _ServiceManagerDisp
}
_communicator.waitForShutdown();
- Ice.Application.defaultInterrupt();
}
catch(FailureException ex)
{