Skip to content

Commit

Permalink
0002679: Add event logging to service wrapper start up
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Jul 14, 2016
1 parent ac7ba90 commit 4630fb3
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
Expand Up @@ -52,5 +52,7 @@ public enum Status {
public static final int RC_MISSING_LIB_FOLDER = 20;
public static final int RC_MISSING_SERVER_PROPERTIES = 21;
public static final int RC_MISSING_SYM_HOME = 22;
public static final int RC_FAIL_CHECK_STATUS = 23;
public static final int RC_ALREADY_RUNNING = 24;

}
Expand Up @@ -54,11 +54,15 @@ public class WindowsService extends WrapperService {

private final static Logger logger = Logger.getLogger(WindowsService.class.getName());

protected final String APP_EVENT_LOG = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application";

protected ServiceControlHandler serviceControlHandler;

protected SERVICE_STATUS_HANDLE serviceStatusHandle;

protected Winsvc.SERVICE_STATUS serviceStatus;

protected HANDLE eventHandle;

@Override
protected boolean setWorkingDirectory(String dir) {
Expand Down Expand Up @@ -365,6 +369,7 @@ protected void updateStatus(Status status) {
break;
case RUNNING:
updateStatus(Winsvc.SERVICE_RUNNING, Winsvc.SERVICE_ACCEPT_STOP);
logEvent(WinNT.EVENTLOG_INFORMATION_TYPE, "The " + config.getName() + " service has started.");
break;
case STOP_PENDING:
updateStatus(Winsvc.SERVICE_STOP_PENDING, 0);
Expand All @@ -386,6 +391,37 @@ protected void updateStatus(int status, int controlsAccepted) {
}
}

protected void logEvent(int eventType, String message) {
HANDLE eventHandle = getEventHandle();
if (eventHandle != null) {
String[] messageArray = { message };
Advapi32.INSTANCE.ReportEvent(eventHandle, eventType, 0, 0, null, 1, 0, messageArray, null);
}
}

protected void logEvent(int eventType, String message, Throwable e) {
HANDLE eventHandle = getEventHandle();
if (eventHandle != null) {
StackTraceElement[] elements = e.getStackTrace();
String[] messageArray = new String[elements.length + 2];
messageArray[0] = message;
messageArray[1] = " ";
for (int i = 0; i < elements.length; i++) {
StackTraceElement element = elements[i];
messageArray[i + 2] = element.getClassName() + "." + element.getMethodName() + "(" + element.getFileName() + ":" +
element.getLineNumber() + ")";
}
Advapi32.INSTANCE.ReportEvent(eventHandle, eventType, 0, 0, null, messageArray.length, 0, messageArray, null);
}
}

protected HANDLE getEventHandle() {
if (eventHandle == null) {
eventHandle = Advapi32.INSTANCE.RegisterEventSource(null, config.getName());
}
return eventHandle;
}

protected Winsvc.SERVICE_STATUS_PROCESS waitForService(SC_HANDLE manager, SC_HANDLE service) {
int seconds = 0;
Advapi32Ex advapi = Advapi32Ex.INSTANCE;
Expand Down Expand Up @@ -432,21 +468,39 @@ protected String getWrapperCommandQuote() {
class ServiceMain implements SERVICE_MAIN_FUNCTION {
@Override
public void serviceMain(int argc, Pointer argv) {
logger.log(Level.INFO, "Getting service status");
logEvent(WinNT.EVENTLOG_INFORMATION_TYPE, "The " + config.getName() + " service is starting.");
serviceControlHandler = new ServiceControlHandler();
serviceStatusHandle = Advapi32Ex.INSTANCE.RegisterServiceCtrlHandlerEx(config.getName(), serviceControlHandler,
null);
if (serviceStatusHandle == null) {
logEvent(WinNT.EVENTLOG_ERROR_TYPE, "Failed to register service control handler.");
System.exit(Constants.RC_FAIL_REGISTER_SERVICE);
}

serviceStatus = new Winsvc.SERVICE_STATUS();
serviceStatus.dwServiceType = WinsvcEx.SERVICE_WIN32_OWN_PROCESS;

boolean isRunning = false;
try {
isRunning = isRunning();
} catch (Throwable e) {
logEvent(WinNT.EVENTLOG_ERROR_TYPE, "Failed to check run status.", e);
updateStatus(Winsvc.SERVICE_STOPPED, 0);
System.exit(Constants.RC_FAIL_CHECK_STATUS);
}

if (!isRunning()) {
execJava(false);
if (!isRunning) {
try {
execJava(false);
} catch (Throwable e) {
logEvent(WinNT.EVENTLOG_ERROR_TYPE, "Failed to execute Java application.", e);
updateStatus(Winsvc.SERVICE_STOPPED, 0);
System.exit(Constants.RC_FAIL_EXECUTION);
}
} else {
logEvent(WinNT.EVENTLOG_ERROR_TYPE, "Exiting because Java application is running from another process.");
updateStatus(Winsvc.SERVICE_STOPPED, 0);
System.exit(Constants.RC_ALREADY_RUNNING);
}
}
}
Expand Down

0 comments on commit 4630fb3

Please sign in to comment.