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

com.alibaba.easyretry.common.RetryContext Maven / Gradle / Ivy

package com.alibaba.easyretry.common;

import com.alibaba.easyretry.common.entity.RetryTask;
import com.alibaba.easyretry.common.serializer.ResultPredicateSerializer;
import com.alibaba.easyretry.common.serializer.RetryArgSerializer;
import com.alibaba.easyretry.common.strategy.StopStrategy;
import com.alibaba.easyretry.common.strategy.WaitStrategy;
import java.lang.reflect.Method;
import java.util.stream.Stream;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.lang3.reflect.MethodUtils;

@Data
@ToString(callSuper = true)
public class RetryContext implements Comparable, RetryLifecycle {

	private RetryTask retryTask;

	private Object executor;

	private Method method;

	private Object[] args;

	private RetryArgSerializer retryArgSerializer;

	private ResultPredicateSerializer resultPredicateSerializer;

	private Long priority;

	private StopStrategy stopStrategy;

	private WaitStrategy waitStrategy;

	private int maxRetryTimes;

	private String onFailureMethod;

	public Method getMethod() {
		return method;
	}

	public Object[] getArgs() {
		return args;
	}

	@Override
	public int compareTo(RetryContext o) {
		return this.priority > o.getPriority() ? 1 : -1;
	}

	@Override
	public void start() {
	}

	@Override
	public void stop() {
		stopStrategy.clear(this);
		waitStrategy.clear(this);
	}

	public static class RetryContextBuilder {

		private RetryContext retryContext;

		private RetryConfiguration retryConfiguration;

		private RetryTask retryTask;

		public RetryContextBuilder(RetryConfiguration retryConfiguration, RetryTask retryTask) {
			retryContext = new RetryContext();
			this.retryConfiguration = retryConfiguration;
			this.retryTask = retryTask;
		}

		public RetryContextBuilder buildArgs() {
			RetryArgSerializer retryArgSerializer =
				retryConfiguration.getRetrySerializerAccess().getCurrentGlobalRetrySerializer();
			Object[] args = retryArgSerializer.deSerialize(retryTask.getArgsStr()).getArgs();
			retryContext.setArgs(args);
			return this;
		}

		public RetryContextBuilder buildExecutor() {
			Object executor =
				retryConfiguration.getExecutorSolver().resolver(retryTask.getExecutorName());
			retryContext.setExecutor(executor);
			return this;
		}

		public RetryContextBuilder buildMethod() {
			Object[] objects = retryContext.getArgs();
			Class[] classes = Stream.of(objects).map(Object::getClass).toArray(Class[]::new);
			Method method =
				MethodUtils.getMatchingMethod(
					retryContext.getExecutor().getClass(), retryTask.getExecutorMethodName(),
					classes);
			retryContext.setMethod(method);
			return this;
		}

		public RetryContextBuilder buildRetryArgSerializer() {
			retryContext.setRetryArgSerializer(
				retryConfiguration.getRetrySerializerAccess().getCurrentGlobalRetrySerializer());
			return this;
		}

		public RetryContextBuilder buildStopStrategy() {
			retryContext.setStopStrategy(
				retryConfiguration.getRetryStrategyAccess().getCurrentGlobalStopStrategy());
			return this;
		}

		public RetryContextBuilder buildWaitStrategy() {
			retryContext.setWaitStrategy(
				retryConfiguration.getRetryStrategyAccess().getCurrentGlobalWaitStrategy());
			return this;
		}

		public RetryContextBuilder buildRetryTask() {
			retryContext.setRetryTask(retryTask);
			return this;
		}

		public RetryContextBuilder buildMaxRetryTimes() {
			retryContext.setMaxRetryTimes(retryConfiguration.getMaxRetryTimes());
			return this;
		}

		public RetryContextBuilder buildOnFailureMethod() {
			retryContext.setOnFailureMethod(retryTask.getOnFailureMethod());
			return this;
		}

		public RetryContextBuilder buildResultPredicateSerializer() {
			retryContext
				.setResultPredicateSerializer(retryConfiguration.getResultPredicateSerializer());
			return this;
		}

		public RetryContextBuilder buildPriority(Long priority) {
			retryContext.setPriority(priority);
			return this;
		}

		public RetryContext build() {
			return retryContext;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy