blob: 36a387e01dcf7a785c8bee8bc9aeaa97ba2bb1f0 [file] [log] [blame]
/*
* Condition Script for implementing the wrapper.commandfile option
*
* On first call the application is started
* With each call the script check for the existance of a command file
* This is a text file with one command per line
* All commands in the file are executed and the file is deleted
* The following commands are supported:
*
* START : start the application if it is not running
* STOP : stop the applicaiton if it is running
* RESTART : restart the application if it is running
* DUMP : request a thread dump
* SHUTDOWN : stop the wrapper and the application
* STATE <file> : writes the current state of the application to the given file
* STARTDUMP : start of cyclic thread dump
* STOPDUMP : stop of cyclic thread dump
*
* Arguments:
* - fileName
*
* Example Configuration:
*
* wrapper.condition.script=scripts/commandCondition.gv
* wrapper.condition.script.args=cmd.txt
* wrapper.condition.cycle=1
*/
// on first call file is bound
// set the file and start the process
if (callCount == 0)
{
file = new File(this.args[0])
process.start()
// at start no cyclic thread dump
nextDumpTime = -1
// uncomment to start cyclic thread dump on start
// nextDumpTime = System.currentTimeMillis()
}
// execute a command
doCommand = { cmd ->
logger.info("executing file command "+cmd);
if ("START".equals(cmd))
process.start();
else if ("STOP".equals(cmd))
process.stop();
else if ("RESTART".equals(cmd))
process.restart();
else if ("DUMP".equals(cmd))
process.threadDump();
else if ("STARTDUMP".equals(cmd))
nextDumpTime = System.currentTimeMillis()
else if ("STOPDUMP".equals(cmd))
nextDumpTime = -1
else if ("SHUTDOWN".equals(cmd))
{
process.stop();
shutdown = true;
}
else if (cmd.startsWith("STATE "))
{
String fName = cmd.substring(6)
writer = new File(fName).newWriter(false) // no append
writer.write(process.getStringState())
writer.close()
}
else
logger.info("unknown command");
}
if (file.exists())
// do the file
try
{
shutdown = false;
logger.info("command file found")
file.eachLine {cmd -> doCommand(cmd)}
file.delete();
logger.info("command file deleted")
if (shutdown)
{
Thread.sleep(5000)
Runtime.getRuntime().halt(0);
}
}
catch (Exception ex)
{
logger.info("Error executing command file "+ex.getMessage())
}
try
{
if (nextDumpTime != -1 && nextDumpTime <= System.currentTimeMillis())
{
doCommand("DUMP")
nextDumpTime = System.currentTimeMillis()+30000
}
}
catch (Exception ex)
{
logger.info("Error executing cyclic thread dump "+ex.getMessage())
}