Comments (6)
As a minimal example, I want the following to return :b
, not :a
:
(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)
from diehard.
Specifically, something like this could work (if you adapt it for diehard.core/fallback
) — I'm using it in a project:
(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))))
from diehard.
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.
from diehard.
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 :retry-if
returns truthy), even when no exception is thrown in the body:
(diehard/with-retry
{:max-retries 2
:retry-if (fn [v _] (= v :a))
:fallback (fn [_ _] (throw (ex-info "Retries exceeded" {})))}
;; No exception thrown here
:a)
Failsafe
supports this (as does a "patched" version of diehard
I'm using in a project); I'd love it diehard
supported it as well.
from diehard.
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:
- check executions in retry block to see if it's the last retry, and throw exception if true
- check the final return value of retry block and throw exception if result is not desired
from diehard.
Hello, wondering how I could "check the final return value of retry block and throw exception if result is not desired".
Checking executions in the "retry-if" clause?
from diehard.
Related Issues (20)
- `deflistener` does not exist HOT 2
- Update to latest failsafe with new features HOT 2
- Failsafe's Timeout usage HOT 3
- Document types and arity of circuit breaker options HOT 1
- :backoff-ms documentation does not match failsafe docs HOT 1
- question on future(...) contruct use HOT 1
- callback on-failure
- Get rid of reflection warnings HOT 1
- Allow retry on Throwable HOT 6
- upgrade to 0.9.3 produces Execution error, 'Unable to resolve spec: ...' HOT 5
- Cannot use listeners with predefined policy HOT 2
- 0.10.1 regression: max-retries not respected HOT 3
- Thank you 🤗 and link to a similar tool
- Use of getFailure is deprecated in FailSafe HOT 2
- cljdoc not accessible since 0.11.4 HOT 2
- Instant cannot be cast to Duration HOT 3
- NullPointerException when combining with-retry and with-timeout HOT 1
- Cljdoc build failure HOT 4
- Circuit breaker not opening HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from diehard.