Class WrapperManager
- All Implemented Interfaces:
Runnable
- Author:
- Leif Mortenson invalid input: '<'leif@tanukisoftware.com>
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intService Control code which can be sent to resume a paused service.static final intService Control code which can be sent to or received interrogate the status of a service.static final intService Control code which can be sent to pause a service.static final intService Control code which can be received when the system is shutting down.static final intService Control code which can be sent to start a service.static final intService Control code which can be sent or received to stop a service.static final intReceived when the user presses CTRL-C in the console on Windows or UNIX platforms.static final intReceived when the user clicks on the close button of a Console on Windows.static final intReceived when a SIG HUP is received on a UNIX system.static final intReceived when the user logs off of a Windows system.static final intReceived when a Windows system is shutting down.static final intReceived when a SIG TERM is received on a UNIX system.static final intReceived when a SIG USR1 is received on a UNIX system.static final intReceived when a SIG USR2 is received on a UNIX system.static final intLog message at advice log level.static final intLog message at debug log level.static final intLog message at error log level.static final intLog message at fatal log level.static final intLog message at info log level.static final intLog message at status log level.static final intLog message at warn log level. -
Method Summary
Modifier and TypeMethodDescriptionstatic void(Testing Method) Cause an access violation within the Java code.static void(Testing Method) Cause an access violation within native JNI code.static voidaddWrapperEventListener(WrapperEventListener listener, long mask) Adds a WrapperEventListener which will receive WrapperEvents.static void(Testing Method) Causes the WrapperManager to go into a state which makes the JVM appear to be hung when viewed from the native Wrapper code.static StringObtain the build time of Wrapper.static WrapperUsergetInteractiveUser(boolean groups) Returns a WrapperUser object which describes the interactive user whose desktop is being interacted with.static intReturns the PID of the Java process.static intgetJVMId()Returns the Id of the current JVM.static PropertiesReturns a Properties object containing expanded the contents of the configuration file used to launch the Wrapper.static WrapperUsergetUser(boolean groups) Returns a WrapperUser object which describes the user under which the Wrapper is currently running.static StringObtain the current version of Wrapper.static intReturns the PID of the Wrapper process.static booleanReturns true if the ShutdownHook for the JVM has already been triggered.static booleanReturns true if the JVM was launched by the Wrapper application.static booleanReturns true if the wrapper.debug property, or any of the logging channels are set to DEBUG in the wrapper configuration file.static booleanReturns true if the Wrapper was launched as an NT service on Windows or as a daemon process on UNIX platforms.static booleanReturns true if the current Wrapper edition has support for Professional Edition features.static booleanReturns true if the current Wrapper edition has support for Standard Edition features.static WrapperWin32Service[]Returns an array of all registered services.static voidRequests that the Wrapper log a message at the specified log level.static voidRemoves a WrapperEventListener so it will not longer receive WrapperEvents.static voidRequests that the current JVM process request a thread dump.static voidrestart()Tells the native wrapper that the JVM wants to restart, then informs all listeners that the JVM is about to shutdown before killing the JVM.static voidTells the native wrapper that the JVM wants to restart, then informs all listeners that the JVM is about to shutdown before killing the JVM.voidrun()static WrapperWin32ServicesendServiceControlCode(String serviceName, int controlCode) Sends a service control code to the specified service.static voidsetConsoleTitle(String title) Sets the title of the console in which the Wrapper is running.static voidsignalStarting(int waitHint) Signal the native wrapper that the startup is progressing but that more time is needed.static voidsignalStopped(int exitCode) This method should not normally be called by user code as it is called from within the stop and restart methods.static voidsignalStopping(int waitHint) Signal the native wrapper that the shutdown is progressing but that more time is needed.static voidstart(WrapperListener listener, String[] args) Start the Java side of the Wrapper code running.static voidstop(int exitCode) Tells the native wrapper that the JVM wants to shut down, then informs all listeners that the JVM is about to shutdown before killing the JVM.static voidstopAndReturn(int exitCode) Tells the native wrapper that the JVM wants to shut down, then informs all listeners that the JVM is about to shutdown before killing the JVM.static voidstopImmediate(int exitCode) Tells the native wrapper that the JVM wants to shut down and then promptly halts.
-
Field Details
-
WRAPPER_CTRL_C_EVENT
public static final int WRAPPER_CTRL_C_EVENTReceived when the user presses CTRL-C in the console on Windows or UNIX platforms.- See Also:
-
WRAPPER_CTRL_CLOSE_EVENT
public static final int WRAPPER_CTRL_CLOSE_EVENTReceived when the user clicks on the close button of a Console on Windows.- See Also:
-
WRAPPER_CTRL_LOGOFF_EVENT
public static final int WRAPPER_CTRL_LOGOFF_EVENTReceived when the user logs off of a Windows system.- See Also:
-
WRAPPER_CTRL_SHUTDOWN_EVENT
public static final int WRAPPER_CTRL_SHUTDOWN_EVENTReceived when a Windows system is shutting down.- See Also:
-
WRAPPER_CTRL_TERM_EVENT
public static final int WRAPPER_CTRL_TERM_EVENTReceived when a SIG TERM is received on a UNIX system.- See Also:
-
WRAPPER_CTRL_HUP_EVENT
public static final int WRAPPER_CTRL_HUP_EVENTReceived when a SIG HUP is received on a UNIX system.- See Also:
-
WRAPPER_CTRL_USR1_EVENT
public static final int WRAPPER_CTRL_USR1_EVENTReceived when a SIG USR1 is received on a UNIX system.- See Also:
-
WRAPPER_CTRL_USR2_EVENT
public static final int WRAPPER_CTRL_USR2_EVENTReceived when a SIG USR2 is received on a UNIX system.- See Also:
-
WRAPPER_LOG_LEVEL_DEBUG
public static final int WRAPPER_LOG_LEVEL_DEBUGLog message at debug log level.- See Also:
-
WRAPPER_LOG_LEVEL_INFO
public static final int WRAPPER_LOG_LEVEL_INFOLog message at info log level.- See Also:
-
WRAPPER_LOG_LEVEL_STATUS
public static final int WRAPPER_LOG_LEVEL_STATUSLog message at status log level.- See Also:
-
WRAPPER_LOG_LEVEL_WARN
public static final int WRAPPER_LOG_LEVEL_WARNLog message at warn log level.- See Also:
-
WRAPPER_LOG_LEVEL_ERROR
public static final int WRAPPER_LOG_LEVEL_ERRORLog message at error log level.- See Also:
-
WRAPPER_LOG_LEVEL_FATAL
public static final int WRAPPER_LOG_LEVEL_FATALLog message at fatal log level.- See Also:
-
WRAPPER_LOG_LEVEL_ADVICE
public static final int WRAPPER_LOG_LEVEL_ADVICELog message at advice log level.- See Also:
-
SERVICE_CONTROL_CODE_START
public static final int SERVICE_CONTROL_CODE_STARTService Control code which can be sent to start a service.- See Also:
-
SERVICE_CONTROL_CODE_STOP
public static final int SERVICE_CONTROL_CODE_STOPService Control code which can be sent or received to stop a service.- See Also:
-
SERVICE_CONTROL_CODE_PAUSE
public static final int SERVICE_CONTROL_CODE_PAUSEService Control code which can be sent to pause a service.- See Also:
-
SERVICE_CONTROL_CODE_CONTINUE
public static final int SERVICE_CONTROL_CODE_CONTINUEService Control code which can be sent to resume a paused service.- See Also:
-
SERVICE_CONTROL_CODE_INTERROGATE
public static final int SERVICE_CONTROL_CODE_INTERROGATEService Control code which can be sent to or received interrogate the status of a service.- See Also:
-
SERVICE_CONTROL_CODE_SHUTDOWN
public static final int SERVICE_CONTROL_CODE_SHUTDOWNService Control code which can be received when the system is shutting down.- See Also:
-
-
Method Details
-
getVersion
Obtain the current version of Wrapper.- Returns:
- The version of the Wrapper.
-
getBuildTime
Obtain the build time of Wrapper.- Returns:
- The time that the Wrapper was built.
-
getJVMId
public static int getJVMId()Returns the Id of the current JVM. JVM Ids increment from 1 each time the wrapper restarts a new one.- Returns:
- The Id of the current JVM.
-
isProfessionalEdition
public static boolean isProfessionalEdition()Returns true if the current Wrapper edition has support for Professional Edition features.- Returns:
- True if professional features are supported.
-
isStandardEdition
public static boolean isStandardEdition()Returns true if the current Wrapper edition has support for Standard Edition features.- Returns:
- True if standard features are supported.
-
setConsoleTitle
Sets the title of the console in which the Wrapper is running. This is currently only supported on Windows platforms.As an alternative, it is also possible to set the console title from within the wrapper.conf file using the wrapper.console.title property.
- Parameters:
title- The new title. The specified string will be encoded to a byte array using the default encoding for the current platform.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("setConsoleTitle") permission.- See Also:
-
getUser
Returns a WrapperUser object which describes the user under which the Wrapper is currently running. Additional platform specific information can be obtained by casting the object to a platform specific subclass. WrapperWin32User, for example.- Parameters:
groups- True if the user's groups should be returned as well. Requesting the groups that a user belongs to increases the CPU load required to complete the call.- Returns:
- An object describing the current user.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("getUser") permission.- See Also:
-
getInteractiveUser
Returns a WrapperUser object which describes the interactive user whose desktop is being interacted with. When a service running on a Windows platform has its interactive flag set, this method will return the user who is currently logged in. Additional platform specific information can be obtained by casting the object to a platform specific subclass. WrapperWin32User, for example.If a user is not currently logged on then this method will return null. User code can repeatedly call this method to detect when a user has logged in. To detect when a user has logged out, there are two options. 1) The user code can continue to call this method until it returns null. 2) Or if the WrapperListener method is being implemented, the WrapperListener.controlEvent method will receive a WRAPPER_CTRL_LOGOFF_EVENT event when the user logs out.
On XP systems, it is possible to switch to another account rather than actually logging out. In such a case, the interactive user will be the first user that logged in. This will also be the only user with which the service will interact. If other users are logged in when the interactive user logs out, the service will not automatically switch to another logged in user. Rather, the next user to log in will become the new user which the service will interact with.
This method will always return NULL on versions of NT prior to Windows 2000. This can not be helped as some required functions were not added to the windows API until NT version 5.0, also known as Windows 2000.
- Parameters:
groups- True if the user's groups should be returned as well. Requesting the groups that a user belongs to increases the CPU load required to complete the call.- Returns:
- The current interactive user, or null.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("getInteractiveUser") permission.- See Also:
-
getProperties
Returns a Properties object containing expanded the contents of the configuration file used to launch the Wrapper. All properties are included so it is possible to define properties not used by the Wrapper in the configuration file and have then be available in this Properties object.- Returns:
- The contents of the Wrapper configuration file.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("getProperties") permission.- See Also:
-
getWrapperPID
public static int getWrapperPID()Returns the PID of the Wrapper process. A PID of 0 will be returned if the JVM was launched standalone. This value can also be obtained using the 'wrapper.pid' system property.- Returns:
- The PID of the Wrpper process.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("getWrapperPID") permission.- See Also:
-
getJavaPID
public static int getJavaPID()Returns the PID of the Java process. A PID of 0 will be returned if the native library has not been initialized. This value can also be obtained using the 'wrapper.java.pid' system property.- Returns:
- The PID of the Java process.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("getJavaPID") permission.- See Also:
-
requestThreadDump
public static void requestThreadDump()Requests that the current JVM process request a thread dump. This is the same as pressing CTRL-BREAK (under Windows) or CTRL-\ (under Unix) in the the console in which Java is running. This method does nothing if the native library is not loaded.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("requestThreadDump") permission.- See Also:
-
appearHung
public static void appearHung()(Testing Method) Causes the WrapperManager to go into a state which makes the JVM appear to be hung when viewed from the native Wrapper code. Does not have any effect when the JVM is not being controlled from the native Wrapper. Useful for testing the Wrapper functions.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("test.appearHung") permission.- See Also:
-
accessViolation
public static void accessViolation()(Testing Method) Cause an access violation within the Java code. Useful for testing the Wrapper functions. This currently only crashes Sun JVMs and takes advantage of Bug #4369043 which does not exist in newer JVMs. Use of the accessViolationNative() method is preferred.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("test.accessViolation") permission.- See Also:
-
accessViolationNative
public static void accessViolationNative()(Testing Method) Cause an access violation within native JNI code. Useful for testing the Wrapper functions. This currently causes the access violation by attempting to write to a null pointer.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("test.accessViolationNative") permission.- See Also:
-
isControlledByNativeWrapper
public static boolean isControlledByNativeWrapper()Returns true if the JVM was launched by the Wrapper application. False if the JVM was launched manually without the Wrapper controlling it.- Returns:
- True if the current JVM was launched by the Wrapper.
-
isLaunchedAsService
public static boolean isLaunchedAsService()Returns true if the Wrapper was launched as an NT service on Windows or as a daemon process on UNIX platforms. False if launched as a console. This can be useful if you wish to display a user interface when in Console mode. On UNIX platforms, this is not as useful because an X display may not be visible even if launched in a console.- Returns:
- True if the Wrapper is running as an NT service or daemon process.
-
isDebugEnabled
public static boolean isDebugEnabled()Returns true if the wrapper.debug property, or any of the logging channels are set to DEBUG in the wrapper configuration file. Useful for deciding whether or not to output certain information to the console.- Returns:
- True if the Wrapper is logging any Debug level output.
-
start
Start the Java side of the Wrapper code running. This will make it possible for the native side of the Wrapper to detect that the Java Wrapper is up and running.This method must be called on startup and then can only be called once so there is no reason for any security permission checks on this call.
- Parameters:
listener- The WrapperListener instance which represents the application being started.args- The argument list passed to the JVM when it was launched.
-
restart
Tells the native wrapper that the JVM wants to restart, then informs all listeners that the JVM is about to shutdown before killing the JVM.This method will not return.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("restart") permission.- See Also:
-
restartAndReturn
Tells the native wrapper that the JVM wants to restart, then informs all listeners that the JVM is about to shutdown before killing the JVM.This method requests that the JVM be restarted but then returns. This allows components to initiate a JVM exit and then continue, allowing a normal shutdown initiated by the JVM via shutdown hooks. In applications which are designed to be shutdown when the user presses CTRL-C, this may result in a cleaner shutdown.
- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("restart") permission.- See Also:
-
stop
public static void stop(int exitCode) Tells the native wrapper that the JVM wants to shut down, then informs all listeners that the JVM is about to shutdown before killing the JVM.This method will not return.
- Parameters:
exitCode- The exit code that the Wrapper will return when it exits.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("stop") permission.- See Also:
-
stopAndReturn
public static void stopAndReturn(int exitCode) Tells the native wrapper that the JVM wants to shut down, then informs all listeners that the JVM is about to shutdown before killing the JVM.This method requests that the JVM be shutdown but then returns. This allows components to initiate a JVM exit and then continue, allowing a normal shutdown initiated by the JVM via shutdown hooks. In applications which are designed to be shutdown when the user presses CTRL-C, this may result in a cleaner shutdown.
- Parameters:
exitCode- The exit code that the Wrapper will return when it exits.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("stop") permission.- See Also:
-
stopImmediate
public static void stopImmediate(int exitCode) Tells the native wrapper that the JVM wants to shut down and then promptly halts. Be careful when using this method as an application will not be given a chance to shutdown cleanly.- Parameters:
exitCode- The exit code that the Wrapper will return when it exits.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("stopImmediate") permission.- See Also:
-
signalStarting
public static void signalStarting(int waitHint) Signal the native wrapper that the startup is progressing but that more time is needed. The current startup timeout will be extended if necessary so it will be at least 'waitHint' milliseconds in the future.This call will have no effect if the current startup timeout is already more than 'waitHint' milliseconds in the future.
- Parameters:
waitHint- Time in milliseconds to allow for the startup to complete.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("signalStarting") permission.- See Also:
-
signalStopping
public static void signalStopping(int waitHint) Signal the native wrapper that the shutdown is progressing but that more time is needed. The current shutdown timeout will be extended if necessary so it will be at least 'waitHint' milliseconds in the future.This call will have no effect if the current shutdown timeout is already more than 'waitHint' milliseconds in the future.
- Parameters:
waitHint- Time in milliseconds to allow for the shutdown to complete.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("signalStopping") permission.- See Also:
-
signalStopped
public static void signalStopped(int exitCode) This method should not normally be called by user code as it is called from within the stop and restart methods. However certain applications which stop the JVM may need to call this method to let the wrapper code know that the shutdown was intentional.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("signalStopped") permission.- See Also:
-
hasShutdownHookBeenTriggered
public static boolean hasShutdownHookBeenTriggered()Returns true if the ShutdownHook for the JVM has already been triggered. Some code needs to know whether or not the system is shutting down.- Returns:
- True if the ShutdownHook for the JVM has already been triggered.
-
log
Requests that the Wrapper log a message at the specified log level. If the JVM is not being managed by the Wrapper then calls to this method will be ignored. This method has been optimized to ignore messages at a log level which will not be logged given the current log levels of the Wrapper.Log messages will currently by trimmed by the Wrapper at 4k (4096 bytes).
Because of differences in the way console output is collected and messages logged via this method, it is expected that interspersed console and log messages will not be in the correct order in the resulting log file.
This method was added to allow simple logging to the wrapper.log file. This is not meant to be a full featured log file and should not be used as such. Please look into a logging package for most application logging.
- Parameters:
logLevel- The level to log the message at can be one of WRAPPER_LOG_LEVEL_DEBUG, WRAPPER_LOG_LEVEL_INFO, WRAPPER_LOG_LEVEL_STATUS, WRAPPER_LOG_LEVEL_WARN, WRAPPER_LOG_LEVEL_ERROR, or WRAPPER_LOG_LEVEL_FATAL.message- The message to be logged.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("log") permission.- See Also:
-
listServices
Returns an array of all registered services. This method is only supported on Windows platforms which support services. Calling this method on other platforms will result in null being returned.- Returns:
- An array of services.
- Throws:
SecurityException- If a SecurityManager has not been set in the JVM or if the calling code has not been granted the WrapperPermission "listServices" permission. A SecurityManager is required for this operation because this method makes it possible to learn a great deal about the state of the system.- See Also:
-
sendServiceControlCode
public static WrapperWin32Service sendServiceControlCode(String serviceName, int controlCode) throws WrapperServiceException, SecurityException Sends a service control code to the specified service. The state of the service should be tested on return. If the service was not currently running then the control code will not be sent.The control code sent can be one of the system control codes: WrapperManager.SERVICE_CONTROL_CODE_START, WrapperManager.SERVICE_CONTROL_CODE_STOP, WrapperManager.SERVICE_CONTROL_CODE_PAUSE, WrapperManager.SERVICE_CONTROL_CODE_CONTINUE, or WrapperManager.SERVICE_CONTROL_CODE_INTERROGATE. In addition, user defined codes in the range 128-255 can also be sent.
- Parameters:
serviceName- Name of the Windows service which will receive the control code.controlCode- The actual control code to be sent. User defined control codes should be in the range 128-255.- Returns:
- A WrapperWin32Service containing the last known status of the service after sending the control code. This will be null if the currently platform is not a version of Windows which supports services.
- Throws:
WrapperServiceException- If there are any problems accessing the specified service.SecurityException- If a SecurityManager has not been set in the JVM or if the calling code has not been granted the WrapperServicePermission permission for the specified service and control code. A SecurityManager is required for this operation because this method makes it possible to control any service on the system, which is of course rather dangerous.- See Also:
-
addWrapperEventListener
Adds a WrapperEventListener which will receive WrapperEvents. The specific events can be controlled using the mask parameter. This API was chosen to allow for additional events in the future. To avoid future compatibility problems, WrapperEventListeners should always test the class of an event before making use of it. This will avoid problems caused by new event classes added in future versions of the Wrapper. This method should only be called once for a given WrapperEventListener. Build up a single mask to receive events of multiple types.- Parameters:
listener- WrapperEventListener to be start receiving events.mask- A mask specifying the event types that the listener is interrested in receiving. See the WrapperEventListener class for a full list of flags. A mask is created by combining multiple flags using the binary '|' OR operator.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the appropriate WrapperEventPermission(...) permission.- See Also:
-
removeWrapperEventListener
Removes a WrapperEventListener so it will not longer receive WrapperEvents.- Parameters:
listener- WrapperEventListener to be stop receiving events.- Throws:
SecurityException- If a SecurityManager is present and the calling thread does not have the WrapperPermission("removeWrapperEventListener") permission.- See Also:
-
run
public void run()
-