boolean success();
/**
+ * Returns the number of consecutive failures. This method only returns a
+ * meaningful number iff {@link #success()} returns {@code false}. If
+ * {@link #success()} returns {@code false} for the first time after
+ * returning {@code true} and this method is called after {@link #success()}
+ * it will return {@code 1}.
+ *
+ * @return The number of consecutive failures
+ */
+ int failCount();
+
+ /**
+ * Sets the fail count of this state.
+ *
+ * @param failCount
+ * The fail count of this state
+ */
+ void setFailCount(int failCount);
+
+ /**
* If {@link #success()} returns {@code false}, this method may return a
* {@link Throwable} to give some details for the reason why retrieving the
* state was not possible. For example, network-based {@link Query}s might
/* wait until the next reaction has to run. */
net.pterodactylus.reactor.State lastState = stateManager.loadState(reactionName);
long lastStateTime = (lastState != null) ? lastState.time() : 0;
+ int lastStateFailCount = (lastState != null) ? lastState.failCount() : 0;
long waitTime = (lastStateTime + nextReaction.updateInterval()) - System.currentTimeMillis();
logger.debug(String.format("Time to wait for next Reaction: %d millseconds.", waitTime));
if (waitTime > 0) {
state = newState;
}
}
- if (state.success()) {
- stateManager.saveState(reactionName, state);
+ if (!state.success()) {
+ state.setFailCount(lastStateFailCount + 1);
}
+ stateManager.saveState(reactionName, state);
- /* only run trigger if we have collected two states. */
+ /* only run trigger if we have collected two successful states. */
Trigger trigger = nextReaction.trigger();
boolean triggerHit = false;
- if ((lastState != null) && state.success()) {
+ if ((lastState != null) && lastState.success() && state.success()) {
logger.debug("Checking Trigger for changes...");
triggerHit = trigger.triggers(state, lastState);
}
/** The optional exception that occured while retrieving the state. */
private final Throwable exception;
+ /** The number of consecutive failures. */
+ private int failCount;
+
/**
* Creates a new successful state.
*/
* {@inheritDoc}
*/
@Override
+ public int failCount() {
+ return failCount;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setFailCount(int failCount) {
+ this.failCount = failCount;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public Throwable exception() {
return exception;
}