All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.tascalate.concurrent.RetryContext Maven / Gradle / Ivy

Go to download

Implementation of blocking (IO-Bound) cancellable java.util.concurrent.CompletionStage and related extensions to java.util.concurrent.ExecutorService-s

There is a newer version: 0.9.8
Show newest version
/**
 * Copyright 2015-2019 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 policy;
    private final int retryCount;
    private final Duration lastCallDuration;
    private final T lastResult;
    private final Throwable lastError;
    
    private RetryContext(RetryPolicy 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 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 - 2024 Weber Informatics LLC | Privacy Policy