-
-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fallback
doesn't support .handleResult
#55
Comments
As a minimal example, I want the following to return (diehard/with-retry
{:max-retries 2
:delay-ms 500
:retry-if (fn [v _] (= v :a))
:fallback (fn [_ _] :b)}
:a) and I want this to throw the exception: (diehard/with-retry
{:max-retries 2
:delay-ms 500
:retry-if (fn [v _] (= v :a))
:fallback (fn [_ _] (throw (ex-info "Stop the boat!" {})))}
:a) |
Specifically, something like this could work (if you adapt it for (defn- ->fallback-policy
[{:as opts :keys [fallback retry-if retry-on retry-when]}]
(when (some? fallback)
(let [f (if-not (fn? fallback) (constantly fallback) fallback)
builder (Fallback/builder
^CheckedFunction
(diehard.util/fn-as-checked-function
(fn [^ExecutionAttemptedEvent exec-event]
(diehard/with-event-context
exec-event
(f (.getLastResult exec-event) (.getLastException exec-event))))))]
(when retry-if
(.handleIf builder ^CheckedBiPredicate (diehard.util/bipredicate retry-if)))
(when retry-on
(.handle builder ^java.util.List (diehard.util/as-vector retry-on)))
(when (contains? opts :retry-when)
(if (fn? retry-when)
(.handleResultIf builder (diehard.util/predicate retry-when))
(.handleResult builder retry-when)))
(.build builder)))) |
In diehard, the last exception is thrown when retries exceeds: (testing "max retry"
(is (thrown? clojure.lang.ExceptionInfo
(with-retry {:max-retries 3}
(throw (ex-info "expected" {})))))) Perhaps this will work for you. |
That's true, and that's useful, but different from the use case I'm describing. I want to have the option to throw on retries exceeded (say, when (diehard/with-retry
{:max-retries 2
:retry-if (fn [v _] (= v :a))
:fallback (fn [_ _] (throw (ex-info "Retries exceeded" {})))}
;; No exception thrown here
:a)
|
I got your point. But using fallback for throwing this exception is a little hack because fallback is designed to provide a value. The throw exception, you have other ways to implement:
|
Hello, wondering how I could "check the final return value of retry block and throw exception if result is not desired". |
I'd like to throw an exception when retries are exceeded. Per https://failsafe.dev/faqs/#how-to-i-throw-an-exception-when-retries-are-exceeded, here's what they recommend (and what works on my machine):
This means
diehard.core/fallback
would have to be reworked slightly to support.handleResult
etc.Awesome library by the way! 🙌 Great functionality, and great abstraction over the Java lib.
The text was updated successfully, but these errors were encountered: