reactor-core v3.3.3.RELEASE Release Notes

Release Date: 2020-02-24 // 3 months ago
  • 🚀 reactor-core 3.3.3.RELEASE is part of Californium-SR16 Release Train.

    ⚡️ ⚠️ Update considerations and deprecations

    • ➕ Added a defer opt-in in VirtualTimeScheduler.create (#1251, #2012)
      • Manually-created VirtualTimeScheduler will now eagerly advance time even if there is no pending task. Use the overload with defer=true to get the old default behavior.
      • StepVerifier-created ones will continue lazily advancing time when no task is scheduled, in order to make testing of things like delays inside a flatMap possible.

    🍱 ✨ New features and improvements

    • 🛠 Fixed Flux.replay / Flux.cache hanging or serving wrong values, by correctly replaying request(UNBOUNDED) when no early subscriber (#2030, #2028)
    • Propagate all req from FluxReplay pre-connect subscribers (#1921)
    • ⏱ Reimplemented boundedElasticScheduler to allow reentrancy (#1992, #2040, #1973)
      • Multiple subscribeOn calls with a BoundedElasticScheduler could easily cause deadlock
      • This also fixes #1973, although there was an intermediate fix in the old implementation
    • From 3.2.15:
      • Discard concatMapIterable/fromIterable's remainder on Cancel (#2014)
      • the remainder of the internal Iterator is discarded when cancelled mid-iteration
      • we avoid the risk of iterating an infinite iterator by first checking if the Iterable is a Collection or its Spliterator has the SIZED characteristic.
      • the above check can result in at most 2 calls to Iterable#iterator for custom iterables
      • [polish] Improve onDiscardMultiple/QueueWithClear resiliency (#2021)

    🍱 🐞 Bug fixes

    • 0️⃣ Avoid parallel insertion in Context's default putAll with foreign Context implementation (#2050)
    • From 3.2.15:
      • Account for requests made to upstream in FluxBufferPredicate (#1937, #2029)
      • collect() discards on consumer error when fused (#2042)
      • Unconditionally dispose worker in MonoSubscribeOn#cancel (#2037)
      • Pass on cancelSupport when lifting ConnectableLiftFuseable (#1860)
      • Correctly count continued errors on flatmapped callable (#2011)
      • Handle "empty Callable" in Flux#collectList (#2023, #2024)
      • Fix fused last(T) not delivering defaultValue (#2020)

    📚 📖 Documentation, Tests and Build

    • Document Flux#next() behavior for an empty Flux (#1899)

    🚀 👍 Thanks to the following contributors that also participated to this release

    @btkelly, @ilyavy, @robotmrv, @yarosla


Previous changes from v3.3.1.RELEASE

  • 🚀 Reactor-Core 3.3.1.RELEASE is part of Dysprosium-SR2 Release Train.

    🚀 It also includes changes from the 3.2.13.RELEASE version.

    ✅ One important change to pick up for testing Reactor is in StepVerifier: the combination of expectNoEvent followed by thenCancel wasn't working terribly well, and a new better terminal expectation has been introduced: expectTimeout (#1913)

    ⚡️ ⚠️ Update considerations and deprecations

    • #1911 Instrument ScheduledExecutorService via Micrometer
    • Instead of doing our own executor decorator we now rely on the Micrometer one, but it might have different coverage of tasks

    🍱 ✨ New features and improvements

    • 🚚 #1557 Removed greediness from FluxBufferTimeout
    • 🚚 #1938 Remove overeager toString calls in FluxIndexFuseable
    • #1913 StepVerifier: expectTimeout(Duration) as an alternative to expectNoEvent(Duration).thenCancel()
    • #1902 When transform or transformDeferred apply a transformation to a non-Reactor Publisher, warn when/if the original Context is lost (#1888)
    • #1966 Internal simplification of how the comparator is applied in collectSortedList
    • 🖨 #1962 Avoid extending Map.Entry in Context1 to ensure various libraries don't represent it inconsistenly when printing out collections of Context
    • #1963 Retain insertion order in ContextN (by extending LinkedHashMap instead of HashMap)
    • 🚀 changes from 3.2.13.RELEASE:
      • #1916 Interpret MAX_VALUEms as indefinite caching in Mono#cache(Function, Function, Supplier) (backported)
      • #1746 Add VirtualTimeScheduler#getScheduledTaskCount() (backported)
      • #1968 Make Flux#publish() propagate 1st subscriber Context
      • #1953 Add Exceptions.isTraceback, and a mean to unwrap a composite without the tacebacks (Exceptions.unwrapMultipleExcludingTracebacks)

    🍱 🐞 Bug fixes

    • 🚀 changes from 3.2.13.RELEASE:
      • #1945 Avoid unnecessary wrapping of exceptions in scalar flatMap
      • #1959 GroupedFlux fused with parallel() not replenishing properly

    📚 📖 Documentation, Tests and Build

    • [doc] #1908 Marble diagram for bufferWhile was incorrectly showing dropped separators
    • [doc] #1915 Flux#join javadoc and marble have been clarified
    • 🚀 [dependency] Bumped BlockHound to the release version (#1923)
    • 🏗 [build] Reorganization of the build with separation of concerns (buildSrc, gradle.properties, etc...) (0bd50de, a1dab8a)
    • 🏗 [build] Add reactor.blockhound to OSGI optional bundles (#1932, #1933)
    • 🚀 [build] Prepare for a releasetrain releaser script: add new tasks, allow mavenLocal source (06977a6, #1960)
    • 🚀 changes from 3.2.13.RELEASE:
      • [build] Switched to Gradle 5.6 (8e97f91)
      • [build] Switched publication plugin to maven-publish and artifactory (#1943)
      • [build] Fixed generation of refguide pdf when custom version is used (2c621b6)
      • [polish] Exceptions.multiple(Iterable) now produces a CompositeException, more test coverage of Exceptions util (#1954)

    🚀 👍 Thanks to the following contributors that also participated to this release

    @andreisilviudragnea, @akarnokd, @berry120, @dittos, @EleanorRoseLegg, @gindex, @jabrena, @simondaudin, @slisaasquatch, @thiyagu-7, @ttddyy, @slisaasquatch, @wonwoo