use of io.kestra.core.annotations.Retryable in project kestra by kestra-io.
the class OverrideRetryInterceptor method intercept.
@Nullable
@Override
public Object intercept(MethodInvocationContext<Object, Object> context) {
Optional<AnnotationValue<Retryable>> opt = context.findAnnotation(Retryable.class);
if (opt.isEmpty()) {
return context.proceed();
}
AnnotationValue<Retryable> retry = opt.get();
MutableRetryState retryState = new SimpleRetry(retry.get("attempts", Integer.class).orElse(5), retry.get("multiplier", Double.class).orElse(2D), retry.get("delay", Duration.class).orElse(Duration.ofSeconds(1)), retry.get("maxDelay", Duration.class).orElse(null), new DefaultRetryPredicate(resolveIncludes(retry, "includes"), resolveIncludes(retry, "excludes")), Throwable.class);
MutableConvertibleValues<Object> attrs = context.getAttributes();
attrs.put(RetryState.class.getName(), retry);
InterceptedMethod interceptedMethod = InterceptedMethod.of(context);
try {
retryState.open();
Object result = retrySync(context, retryState, interceptedMethod);
switch(interceptedMethod.resultType()) {
case SYNCHRONOUS:
retryState.close(null);
return result;
default:
return interceptedMethod.unsupported();
}
} catch (Exception e) {
return interceptedMethod.handleException(e);
}
}
Aggregations