Handles all communication with the native portion of the Wrapper code.
The native wrapper code will launch Java in a separate process and set
up a server socket which the Java code is expected to open a socket to
on startup. When the server socket is created, a port will be chosen
depending on what is available to the system. This port will then be
passed to the Java process as property named "wrapper.port".
For security reasons, the native code will only allow connections from
localhost and will expect to receive the key specified in a property
named "wrapper.key".
This class is implemented as a singleton class.
Generate JNI Headers with the following command in the build/classes
directory:
javah -jni -classpath ./ org.tanukisoftware.wrapper.WrapperManager
WRAPPER_CTRL_CLOSE_EVENT
public static final int WRAPPER_CTRL_CLOSE_EVENT
- 201
WRAPPER_CTRL_C_EVENT
public static final int WRAPPER_CTRL_C_EVENT
- 200
WRAPPER_CTRL_LOGOFF_EVENT
public static final int WRAPPER_CTRL_LOGOFF_EVENT
- 202
WRAPPER_CTRL_SHUTDOWN_EVENT
public static final int WRAPPER_CTRL_SHUTDOWN_EVENT
- 203
WRAPPER_LOG_LEVEL_ADVICE
public static final int WRAPPER_LOG_LEVEL_ADVICE
Log message at advice log level.
- 7
WRAPPER_LOG_LEVEL_DEBUG
public static final int WRAPPER_LOG_LEVEL_DEBUG
Log message at debug log level.
- 1
WRAPPER_LOG_LEVEL_ERROR
public static final int WRAPPER_LOG_LEVEL_ERROR
Log message at error log level.
- 5
WRAPPER_LOG_LEVEL_FATAL
public static final int WRAPPER_LOG_LEVEL_FATAL
Log message at fatal log level.
- 6
WRAPPER_LOG_LEVEL_INFO
public static final int WRAPPER_LOG_LEVEL_INFO
Log message at info log level.
- 2
WRAPPER_LOG_LEVEL_STATUS
public static final int WRAPPER_LOG_LEVEL_STATUS
Log message at status log level.
- 3
WRAPPER_LOG_LEVEL_WARN
public static final int WRAPPER_LOG_LEVEL_WARN
Log message at warn log level.
- 4
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.
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.
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.
getBuildTime
public static String getBuildTime()
Obtain the build time of Wrapper.
- The time that the Wrapper was built.
getInteractiveUser
public static WrapperUser getInteractiveUser(boolean groups)
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.
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.
- The current interactive user, or null.
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.
- The Id of the current JVM.
getNonDaemonThreadCount
protected static int getNonDaemonThreadCount()
Returns a count of all non-daemon threads in the JVM, starting with the top
thread group.
- Number of non-daemon threads.
getUser
public static WrapperUser getUser(boolean groups)
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.
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.
- An object describing the current user.
getVersion
public static String getVersion()
Obtain the current version of Wrapper.
- The version of the Wrapper.
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.
- True if the ShutdownHook for the JVM has already been triggered.
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.
- True if the current JVM was launched by the Wrapper.
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.
- True if the Wrapper is logging any Debug level output.
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.
- True if the Wrapper is running as an NT service or daemon
process.
log
public static void log(int logLevel,
String message)
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.
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.
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.
restart
public static void 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.
setConsoleTitle
public static void setConsoleTitle(String title)
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.
title
- The new title. The specified string will be encoded
to a byte array using the default encoding for the
current platform.
signalStarting
public static void signalStarting(int waitHint)
Signal the native wrapper that the startup is progressing but that more
time is needed. The Wrapper will extend the startup timeout by the
specified time.
waitHint
- Additional time in milliseconds.
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.
signalStopping
public static void signalStopping(int waitHint)
Signal the native wrapper that the shutdown is progressing but that more
time is needed. The Wrapper will extend the stop timeout by the
specified time.
waitHint
- Additional time in milliseconds.
start
public static void start(WrapperListener listener,
String[] args)
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.
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.
exitCode
- The exit code that the Wrapper will return when it exits.
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.
exitCode
- The exit code that the Wrapper will return when it exits.