Git Product home page Git Product logo

Comments (4)

chemicL avatar chemicL commented on May 27, 2024 1

Hi, @ferrerogg! Thanks for bringing this up. I found a previous discussion regarding this and some interesting points there.

  1. The idea that you bring about nesting the TimeoutException was suggested by @simonbasle in #2267 (comment)
  2. Afterwards it was dismissed: #2267 (comment)

Apparently, it seems it is of importance to some users, including yourself. So let's reconsider it. Can you please share a little bit what the scenario is that you need this in? I don't want to frame guesses, but I have a feeling in 2024 this might be a more frequent case. However, I'd love to make sure that we are not promoting bad patterns with whatever the end solution ends up looking like.

Regarding a different Exception type, it would be a breaking change and I'd prefer not to do it.

However, adding a cause or a suppressed exception would be a behaviour change, yet I dare to say not a breaking one.

So I look forward to some usage examples and scenarios and unless there is pushback I'd be up for improving this situation. Obviously it won't be without cost, as adding something without changing the type of the thrown exception requires a bit more of runtime memory to be allocated – but that can be a preferable tradeoff compared to string matching. Therefore, if we decide to change this, I'd target this for 3.6.x line.

from reactor-core.

ferrerogg avatar ferrerogg commented on May 27, 2024 1

Hi @chemicL
I'm a newbie in Reactor, so I'm trying to experiment.
My use case is quite simple in pseudo-code

List  = Flux.fromIterable(myListOfItemsToSubmitToSpringWebClient)
  .flatMapSequential(item -> callWebClient(item))
  .collectList()
  .block(maxWorkTimeout);

This fragment calls a Spring WebClient that posts an "item" to a remote web service (not managed by me). Item responses are then collected into a List and then further processed in a old-style blocking code library (not managed by me).
Because remote service SLA is unknown, I would like to try the above processing with a timeout, so that caller could retry later if the remote service is overloaded.

Using block(timeout) seems the the intuitive and easiest way to achieve this requirement.
I also found that I can probably refactor previous code introducing a .timeout()

List  = Flux.fromIterable(myListOfItemsToSubmitToSpringWebClient)
  .flatMapSequential(item -> callWebClient(item))
  .collectList()
  .timeout(maxWorkTimeout);
  .block();

This code would throw a "wrapped" checked java.util.concurrent.TimeoutException, so I guess I can use this instead of digging into IllegalStateException message.

Nevertheless I think that both approaches (.timeout(Duration) and .block(Duration)) should lead to similar exception handling it they are interchangeable

from reactor-core.

chemicL avatar chemicL commented on May 27, 2024 1

@ferrerogg thanks for providing your use case, it sounds like a typical scenario. I agree it makes sense to provide a better default than having to add an additional operator. Therefore, adding a TimeoutException with the same message as the IllegalStateException as a cause is the aim here. I'll mark this issue as a good one for contribution, perhaps someone would like to give it a go.

from reactor-core.

injae-kim avatar injae-kim commented on May 27, 2024 1

Thank you for the nice issue and discussions!

However, adding a cause or a suppressed exception would be a behaviour change, yet I dare to say not a breaking one.
Therefore, adding a TimeoutException with the same message as the IllegalStateException as a cause is the aim here.

I checked all discussions and agree with this way, so created fix PR #3733 :)

from reactor-core.

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.