public void run() { try { init(); } catch (Exception e) { log.log(LogLevel.WARNING,"Init threw exception",e); initException = e; } synchronized (this) { initState = InitState.DONE; this.notifyAll(); } }
@Override public void select(RoutingContext routingContext) { synchronized (this) { if (initException != null) { Reply reply = new EmptyReply(); reply.addError(new com.yahoo.messagebus.Error(ErrorCode.POLICY_ERROR, "Policy threw exception during init:" + exceptionMessageWithTrace(initException))); routingContext.setReply(reply); return; } checkStartInit(); if (initState == InitState.RUNNING) { Reply reply = new EmptyReply(); reply.addError(new com.yahoo.messagebus.Error(ErrorCode.SESSION_BUSY, "Policy is waiting to be initialized.")); routingContext.setReply(reply); return; } } doSelect(routingContext); }
private synchronized void checkStartInit() { if (initState == InitState.NOT_STARTED) { if (syncInit) { init(); initState = InitState.DONE; } else { executor = new ScheduledThreadPoolExecutor(1); executor.execute(this); initState = InitState.RUNNING; } } }