GithubHelp home page GithubHelp logo

Comments (6)

alexandergunnarson avatar alexandergunnarson commented on August 20, 2024

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.

alexandergunnarson avatar alexandergunnarson commented on August 20, 2024

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.

sunng87 avatar sunng87 commented on August 20, 2024

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.

alexandergunnarson avatar alexandergunnarson commented on August 20, 2024

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.

sunng87 avatar sunng87 commented on August 20, 2024

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.

nlessa avatar nlessa commented on August 20, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.