@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }
@Override public void enterCritical(int path) { if (analyzer.isMeasuring()) { measures[path].enterCritical(); } }
public CriticalComponentImpl(CriticalAnalyzer analyzer, int numberOfPaths) { if (analyzer == null) { analyzer = EmptyCriticalAnalyzer.getInstance(); } this.analyzer = analyzer; if (analyzer.isMeasuring()) { measures = new CriticalMeasure[numberOfPaths]; for (int i = 0; i < numberOfPaths; i++) { measures[i] = new CriticalMeasure(); } } else { measures = null; } }
public CriticalMeasure() { //prefer this approach instead of using some fixed value because System::nanoTime could change sign //with long running processes enterCritical(); leaveCritical(); }
@Override public void check() { boolean retry = true; while (retry) { try { for (CriticalComponent component : components) { if (component.isExpired(timeoutNanoSeconds)) { fireAction(component); // no need to keep running if there's already a component failed return; } } retry = false; // got to the end of the list, no need to retry } catch (ConcurrentModificationException dontCare) { // lets retry on the loop } } }
@Override public boolean isExpired(long timeout) { for (int i = 0; i < measures.length; i++) { if (measures[i].isExpired(timeout)) { return true; } } return false; } }
@Override public <T> T convert(Class<T> type, Object value) { return type.cast(CriticalAnalyzerPolicy.valueOf(value.toString())); } }
@Override public long getCheckTimeNanoSeconds() { if (checkTimeNanoSeconds == 0) { checkTimeNanoSeconds = getTimeout(TimeUnit.NANOSECONDS) / 2; } return checkTimeNanoSeconds; }
@Override public CriticalAnalyzer setTimeout(long timeout, TimeUnit unit) { if (checkTimeNanoSeconds <= 0) { this.setCheckTime(timeout / 2, unit); } this.timeoutNanoSeconds = unit.toNanos(timeout); return this; }
@Override public void run() { logger.trace("Checking critical analyzer"); check(); } };
private void fireAction(CriticalComponent component) { for (CriticalAction action : actions) { try { action.run(component); } catch (Throwable e) { logger.warn(e.getMessage(), e); } } actions.clear(); }
@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }
@Override public void enterCritical(int path) { if (analyzer.isMeasuring()) { measures[path].enterCritical(); } }
@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }
@Override public void enterCritical(int path) { if (analyzer.isMeasuring()) { measures[path].enterCritical(); } }
@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }
@Override public void enterCritical(int path) { if (analyzer.isMeasuring()) { measures[path].enterCritical(); } }
@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }
@Override public void enterCritical(int path) { if (analyzer.isMeasuring()) { measures[path].enterCritical(); } }
@Override public void leaveCritical(int path) { if (analyzer.isMeasuring()) { measures[path].leaveCritical(); } }