
net.tascalate.concurrent.RetryContext Maven / Gradle / Ivy
/**
* Copyright 2015-2020 Valery Silaev (http://vsilaev.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.tascalate.concurrent;
import java.time.Duration;
public final class RetryContext {
private final RetryPolicy super T> policy;
private final int retryCount;
private final Duration lastCallDuration;
private final T lastResult;
private final Throwable lastError;
private RetryContext(RetryPolicy super T> policy, int retryCount, Duration lastCallDuration, T lastResult, Throwable lastError) {
this.policy = policy;
this.retryCount = retryCount;
this.lastCallDuration = lastCallDuration;
this.lastResult = lastResult;
this.lastError = lastError;
}
public int getRetryCount() {
return retryCount;
}
public Duration getLastCallDuration() {
return lastCallDuration;
}
public T getLastResult() {
return lastResult;
}
public Throwable getLastError() {
return lastError;
}
public RetryContext overrideRetryCount(int newRetryCount) {
return new RetryContext<>(policy, newRetryCount, lastCallDuration, lastResult, lastError);
}
public RetryContext overrideLastCallDuration(Duration newDuration) {
return new RetryContext<>(policy, retryCount, newDuration, lastResult, lastError);
}
public RetryContext overrideLastResult(T newResult) {
return new RetryContext<>(policy, retryCount, lastCallDuration, newResult, lastError);
}
public RetryContext overrideLastError(Throwable newError) {
return new RetryContext<>(policy, retryCount, lastCallDuration, lastResult, newError);
}
static RetryContext initial(RetryPolicy super T> policy) {
return new RetryContext<>(policy, 0, Duration.ZERO, null, null);
}
RetryPolicy.Verdict shouldContinue() {
return policy.shouldContinue(this);
}
RetryContext nextRetry(Duration callDuration, T lastResult) {
return new RetryContext<>(policy, retryCount + 1, callDuration, lastResult, null);
}
RetryContext nextRetry(Duration callDuration, Throwable lastError) {
return new RetryContext<>(policy, retryCount + 1, callDuration, null, lastError);
}
boolean isValidResult(T newResult) {
return policy.acceptResult(newResult);
}
RetryException asFailure() {
RetryException result = new RetryException(retryCount, lastCallDuration, lastError);
result.fillInStackTrace();
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy