Changelog History
Page 1
-
v3.4.1 Changes
December 08, 2020๐ Reactor-Core
3.4.1
is part of2020.0.2
Release Train (Europium SR2).๐ This service release contains bugfixes and new features.
๐ This note focuses on changes specific to this version, but all changes from
3.2.22.RELEASE
and3.3.12.RELEASE
are also included.โก๏ธ โ ๏ธ Update considerations and deprecations
- ๐ fix #2459 Add a composite of all source as cause to firstWithValue error
- this was overlooked when merging the new operator in 3.4.0, so we decided it was fresh enough that the slight behavior change would be acceptable
๐ฑ โจ New features and improvements
- ๐ fix #2195 Add timed() operator
- this new operator exposes various timing information on a
Timed
wrapper object, allowing richer output ofDuration
compared toelapsed()
andtimestamp()
(which useTuple2
andLong
)
- this new operator exposes various timing information on a
- ๐ [reactor-test] fix #2269 Add test util to capture logs in early-established loggers (see also #2512)
LoggerUtils
allows the early installation of aLogger
factory that will forward to a classic factory AND let the user activate a logging indirection later on during tests- this allows a
TestLogger
to capture internal logs from operators that were classloaded earlier than the unit test
- โ
[reactor-test] fix #1518 Add cold variants of
TestPublisher
- cold variants better behave wrt backpressure and can replay to multiple subscribers at various stages
- the old behavior (of ignoring requested amount) is still available through a
createColdNonCompliant
variant
- โ
[reactor-test] When asserting
Context
inStepVerifier
, say from which operator the asserted Context was taken (#2518)
๐ฑ ๐ Bug fixes
- ๐ Make
RetryWhenMainSubscriber#onError
's calls serial (#2499, Fixes #2488) - ๐ fix #2513 ReplayProcessor now correctly pass nanos to buffer, not ms
- ๐ from 3.3.12.RELEASE:
- fix #2519 Cancel propagation on empty collectXxx
- ๐ from 3.2..22.RELEASE:
- fix #2498 Exception thrown in Flux.handle causes hanging in fused case
๐ ๐ Documentation, Tests and Build
- ๐ Various documentation improvements (#2463, #2457, #2469)
- ๐ fix #2468 Review and polish deprecation suppressions
- ๐ fix #2502 Generate OSGI Bundle-Version from Europium+ scheme
๐ ๐ Thanks to the following contributors that also participated to this release
- ๐ fix #2459 Add a composite of all source as cause to firstWithValue error
-
v3.4.0 Changes
October 27, 2020๐ Reactor-Core
3.4.0
is part of2020.0.0
Release Train (codenameEuropium
).๐ This is the first GA release of Europium ๐
This note focuses on
3.4.0
proper, curating changes from across all milestones.
๐ Note that the 3.4.0 effort was started right after3.3.5.RELEASE
, so this version also contains changes from 3.3.6 to 3.3.11 (see the end of the notes for links).๐ฑ โ ๏ธ Known Issues
- ๐ป the
firstWithValue
new operator has an undocumented way of checking the cause of failure for individual sources, but it uses a suppressed exception rather than a cause. Please refrain from using that, as we'll switch toinitCause
in3.4.1
(and properly document the behavior, setting it in stone) => #2459
โก๏ธ โ ๏ธ Update considerations
๐ฑ โ ๏ธ ๐๏ธ Removals
- โฑ Schedulers deprecated back in 3.3 have been removed (
WorkQueueProcessor
andTopicProcessor
, #2208) - ๐ Previously deprecated methods and types have been removed (see #2277)
๐ฑ โ ๏ธ โ Deprecations
- โฑ
Schedulers.elastic()
and variants are deprecated, to be removed in 3.5 (#1893) - ๐
FluxProcessor
(as well as all concrete implementations of it) are now deprecated and will be removed in 3.5 (#2188, #2431)- see the main focus section below for more details
- ๐ [api-change]
MonoProcessor
is made abstract and deprecated, to be removed in 3.5 (#2188, #1053 / f04bede, #2431)- see the main focus section below for more details
- ๐
Flux.subscribe(Consumer<Subscription>)
variant is deprecated, to be removed in 3.5 (#1825) - ๐ฆ
first
is deprecated to be renamed tofirstWithSignal
(seefirstWithValue
in the new features below). The old deprecated method will be removed in 3.5 (#2173) Context
changes (#2282):- Operators exposing the
Context
at points where there is no use attempting to use write methods are deprecated and will be removed in 3.5 (#2293, 7d6c862) - these all receive a
ContextView
-based variant (see new features below) deferWithContext
=>deferContextual
with aContextView
Signal.getContext()
=>Signal.getContextView()
- Operators modifying the
Context
are renamed to be clearer. Old names are deprecated and will be removed in 3.5 (see new feature below, #2148, eed93d6)
- Operators exposing the
๐ฑ โ ๏ธ โป๏ธ Behavior Changes
- Most operators that take a
Duration
and convert it to milliseconds now use nanosecond precision (#1734) - ๐
Operators.onErrorDropped
no longer throws, but only logs the dropped exception (#1431) - ๐ฆ When an
onError
signal reaches the last (lambda based) subscriber in a chain which doesn't have an error handler, the exception is no longer thrown but only logged (#2176) - โฑ Vanilla implementations of
Scheduler
now initiate their backing infrastructure and applySchedulers
decorator instart()
rather than the constructor (#1778)start()
is also now implicitly called when instantiating aScheduler
via theSchedulers.Factory
- Allows to avoid
this
leaking from constructor - โ ๏ธ Custom implementations should similarly initialized and optionally decorate in
start()
EmitterProcessor
with a full backpressure queue no longer blocks until data is requested, but fails fast (#2049)- Metrics changes
- Change in how metric meters/tags are named in accordance with the
name
operator (#1928, #2302) flow
tag has been removed entirely- using the
name({String})
operator will replacereactor.
prefix in meter names with the user-provided{String}.
- โ ๏ธ using custom tags via the
tags(String...)
operator, but notname(String)
still creates a sparse set of tags in the application which could be rejected by some metrics backend - Change name of some meters that used to include (redundant) unit names (#1807)
reactor_requested_requested_amount
=>{name}_requested
reactor_subscribed_subscribers
=>{name}_subscribed
- notice these meters also take the user-provided
{name}
into account from the above change - Differentiate empty vs valued sequences in metrics via the
status
tag, introducingcompletedEmpty
value (#1803)
- Change in how metric meters/tags are named in accordance with the
๐ฑ โ ๏ธ โจ Main focus:
Sinks
๐
Sinks
are a new API constructed to replace theFluxProcessor
andMonoProcessor
APIs, which have been deprecated (#2431, #1053).We distinguish
Sinks.Many<T>
(aFlux
-like sink),Sinks.One<T>
(aMono
-like sink) andSinks.Empty
(aMono<Void>
-like sink).These sinks are constructed through specs under the
Sinks
class. They expose a two-faced API:- methods starting with
tryEmit
are atomic, never throw (#2319, #2329, #2336, #2426) and immediately return anEmitResult
enum (originally named Emission) indicating various variations of success or error (#2319, #2338) - 0๏ธโฃ methods starting with
emit
attempt to provide an easier facade over the above, take anEmitFailureHandler
allowing to fine tune some aspects of the default behavior (#2377)
0๏ธโฃ By default, the instances are "serialized", detecting parallel usage and failing fast in
tryEmit
(#2342, #2410, #2365, 19fc1ba, #2412).
The vanilla reactor sink implementations ofemit
API terminate with the equivalent of anemitError
when parallel usage is detected (#2365) but by using theEmitFailureHandler
to drive the sink to retry, possibly with a small amount of sleeping, it should be possible to optimistically get rid of the contention.It is also possible to get a low-overhead, low-protection instance of vanilla sinks by using the
Sinks.unsafe()
spec (#2418).
This doesn't detect parallel usage, so it must be used in a responsible way (in a context where the Reactive Streams contract is already externally enforced).Sinks also expose a
asFlux()
view (orasMono()
, as relevant) for them to be passed to downstream and subscribed, and also expose a bit of state throughcurrentSubscriberCount()
getter (#2372) and by beingScannable
(at a minimum forTERMINATED
andCANCELLED
attributes, #2394).Compared to existing processors, most flavors have a sink equivalent except
DirectProcessor
, with two close cousins underSinks.many().multicast()
(#2392, #2451):directAllOrNothing
will ignoretryEmitNext
attempts when at least one subscriber doesn't have enough demand,directBestEffort
will instead push to the subset of subscribers with demand and drop from the perspective of slow subscribers.
๐ This differs from
DirectProcessor
in the sense that both these sinks are kept open in such a situation, so slow subscribers that increase their request will start seeing values pushed after that (instead of being immediately terminated in DirectProcessor).There is also a new flavor: an
onBackpressureError()
variant of the unicast Sink (#2347)๐ ๐ Bugfixes
๐ See links to Dysprosium releases (3.3.6 to 3.3.11) at the end.
๐ฑ โจ New features
concatMap
now has a variant with 0 prefetch (#2202)- ๐
All
Scannable
operators answer the newAttr.RUN_STYLE
attribute with aRunStyle
enum (#2058, #2123)- the enum allows to identify operators that run synchronously. Attribute is accessible both at
Publisher
andSubscriber
level RunStyle.SYNC
guarantees the operator doesn't change threadsRunStyle.ASYNC
indicates the operator MAY change threadsRunStyle.UNKNOWN
(the default) indicates there's no available information (eg. due to the operator wrapping an arbitraryPublisher
)
- the enum allows to identify operators that run synchronously. Attribute is accessible both at
- ๐ง A Reactor-wide Micrometer
MetricsRegistry
other than the global one can now be configured (#2253, 64fd556)- Use
Metrics.MicrometerConfiguration#useRegistry
for that purpose - The above will attempt to load Micrometer classes, so Micrometer MUST be on the classpath
- Use
- ๐ New reactive context features (#2282):
Context
now extends a simplifiedContextView
API which only expose the read methods (#2279, #2293)- the goal is to avoid exposing a seemingly writable (copy-on-write)
Context
when the only meaningful operations are read operations - exposed in
Signal#getContextView()
,deferContextual
operator (variant to deferWithContext) and newtransformDeferredContextual
operator - Added
transformDeferredContextual
operator that takes aBiFunction
, allowing to access theContextView
in the transformation (#2280 then renamed in #2293) Mono.subscribe(valueConsumer, errorConsumer, ...)
errorConsumer
now gets notified of exceptions thrown by the valueConsumer
(#1995)- Renamed
Context
operators with clearer names (#2148, eed93d6) Mono.subscriberContext()
is not aliased, we now advise to useMono.deferContextual(Mono::just)
to get the exact same behaviorsubscriberContext(Context)
is replaced bycontextWrite(ContextView)
(notice the use ofContextView
)- subscriberContext(Function) is replaced by
contextWrite(Function)
- โ Added method to snapshot factory+global schedulers (#2325, #2326, f9c7993)
- use
Schedulers.setFactoryWithSnapshot(Factory)
to get aSnapshot
object while replacing theFactory
- reset the old factory by using
resetFrom(Snapshot)
- this is used by the reactor-test
VirtualTimeScheduler
to reset previously customized factories
- use
- The
ParallelFlux.subscribe(array)
method is now public to allow delegation in wrappers (#2328) - ๐ฆ The
Retry
object driving#retryWhen
operator can now store user-provided state in the form of aContextView
, which is exposed throughRetrySignal
(#2312, bd8db8a) - The
GroupedFlux#key()
method is now marked as@NonNull
(#2397) - โ Added
firstWithValue
factory operator (#2173, 41c937f)- like
first
, it let multiple sources compete - except it prioritizes valued sources: empty sources are considered irrelevant
- if no source completes with a value, a
NoSuchElementException
is thrown
- like
๐ Improvements
- Have push(emitter) delegate to push(emitter, backpressure) (#2177)
- ๐ป Lazily instantiate exception in Mono#repeatWhenEmpty (#2221)
- ๐ฒ
log()
will log context access at FINE(ST) level and now uses the more correctcurrentContext
prefix (#2220) Mono#materialize()
now takes into account that the source IS aMono
, so it doesn'tcancel()
it when materializing itsonNext
(#2424, 765bfe8)- this could be considered a behavior change, but the previous behavior was unnecessary. cancelling the result of the materialization still propagates to the source.
๐ ๐ Documentation, Tests and Build
- [doc] fix #2170 Make parallel runOn methods doc consistent about work stealing
- [doc] Document Android 21 desugaring options (#2232)
- ๐ [build] #2237 remove most compilation warnings
- [doc] fix #2136 Turn discard/errorMode javadoc tags into plain paragraphs
- ๐ [build] fix #2400 use a different name for the jcstress jar
- ๐ [build] Remove compilation warnings related to jsr305 (85da74b)
๐ ๐ Thanks to the following contributors that also participated to this release
@AayushyaVajpayee, @camsteffen, @cnabro, @hamidshahid, @Inego, @jonenst, @josemalonsom, @OlegDokuka, @robotmrv, @seants, @smaldini, @steppedreckoner, @yschimke
๐ Links to Dysprosium release notes during 3.4.0 development effort
๐ All changes from these releases have been forward-merged into
3.4.0
:- ๐
v3.3.6.RELEASE
- ๐
v3.3.7.RELEASE
- ๐
v3.3.8.RELEASE
- ๐
v3.3.9.RELEASE
- ๐
v3.3.10.RELEASE
- ๐
v3.3.11.RELEASE
- ๐ป the
-
v3.4.0-RC2 Changes
October 12, 2020๐ Reactor-Core
3.4.0-RC2
is part of2020.0.0-RC2
Release Train (codenameEuropium
).๐ This second Release Candidate brings further changes to the
Sinks
API introduced in M2 and polished in RC1.๐ This release note contains all the changes specific to RC2, as well as some forwarded changes that will be released in 3.3.11.RELEASE.
โก๏ธ โ ๏ธ Update considerations and deprecations
- Rework Sinks specs to put unsafe() at root level (#2418)
- ๐ Rename Emission to EmitResult (#2426)
- โ Remove deprecated emit API (#2377)
- ๐ Deprecate [Flux|Mono]Processor contracts entirely (#2431)
๐ฑ โจ New features and improvements
- โ Add
emitXxx(EmitFailureHandler)
Sinks API (#2377) - โ Add firstWithValue operator, alias/deprecate first (#2173)
- VoidProcessor is now a pure empty sink (#2408)
- โ Add serialized wrappers for
Sinks.Empty/Sinks.One
(#2410) - โ Add currentSubscriberCount() to
Sinks.Many|One|Empty
(#2372) - ๐ Make sinks scannable for TERMINATED (and CANCELLED) (#2394)
- โ Add directAllOrNothing/directBestEffort multicast Sinks (#2392)
- ๐ Change
GroupedFlux#key
to@NonNull
(#2397)
๐ฑ ๐ Bug fixes
- ๐ Fix concurrent terminal signal detection in
SerializedManySink
(#2412) - ๐ Fix potential integer overflow on
BoundedElasticScheduler
constructor (#2389)
๐ ๐ Documentation, Tests and Build
- correct marbles for transformDeferred (#2358)
- ๐ fix windowWithBoundary marble diagram (#2346)
- ๐ Don't blanket hide deprecated members in javadoc (#2416)
- โฌ๏ธ Bump jcstress-gradle-plugin to natively fix jar classifier (#2429)
- ๐ use a different name for the jcstress jar (#2400)
- ๐ [polish] Increase timeout duration to 1ms to avoid hiccups
- ๐ [build] Polish granularity of stacks for Nested tests
- ๐ [polish] StressSubscriber generified, track onSubscribe, initRequest
- ๐ [doc] Polish Sinks doc accounting for RC1 and RC2 latest changes (#2414)
- ๐ [test] Polish tests that use nano durations to avoid flakkyness (#2421)
๐ ๐ Thanks to the following contributors that also participated to this release
-
v3.4.0-RC1 Changes
September 15, 2020๐ Reactor-Core
3.4.0.-RC1
is part of2020.0.0-RC1
Release Train (codenameEuropium
).๐ This first Release Candidate brings further changes to the
Sinks
API introduced in M2๐ This release note focuses on RC1-specific changes, but RC1 also contains all the changes released in 3.2.20.RELEASE and 3.3.10.RELEASE.
โก๏ธ โ ๏ธ Update considerations and deprecations
โก๏ธ Processors and sinks update considerations
๐ฆ The most impactful change is the switch in focus from an API that emulates
Subscriber
(with void return types) to a lower level API that can consistently provide immediate feedback to a signalling attempt via the returnedEmission
. Now the later is prefixed withtryEmit
. Anemit
API is offered as an initial problematic attempt at a higher level abstraction, but it had to be@Deprecated
. See #2374 for potential ways to rewrite code that used to callonNext
/next
/emitNext
-without-checking-returned-Emission in previous versions.@simonbasle is also preparing a retrospective write up of all the changes through which the sinks API went in #2382.
emitXxx
replaced withtryEmitXxx
- ๐ See #2319 : Split emitXxx/tryEmitXxx, more consistent use of hooks.
๐ new
Emission.FAIL_xxx
error codesEmission.FAIL_NON_SERIALIZED
(see #2342 Failing fast on non-serialized access to Sink)Emission.FAIL_ZERO_SUBSCRIBER
(see #2338 Add new Emission FAIL_ZERO_SUBSCRIBER error code)
"safe"
onBackpressureError()
not exposed anymore- ๐ See #2375 : Remove
Sinks.many().multicast().onBackpressureError()
.
๐
emitXxx
part of the API to be removed / heavily reworked- ๐ See #2374 : Deprecate Sinks
emit{Next,Error,Complete}
methods.
๐ฑ ๐ Bug fixes
- These are incremental improvements over the
tryEmitNext
API (previouslyemitNext
in M2):
๐ฑ โจ New features and improvements
- #2312 Add user provided state to
Retry
- โฑ #2325 Add method to snapshot factory+global schedulers, used by VTS (#2326)
- #2328 Make ParallelFlux.subscribe(array) public to allow delegation
Sinks
related improvements over M2:- ๐ [Polish] Add inners[] param to Operators dropMulticast private methods
๐ ๐ Documentation, Tests and Build
- [doc] As the custom javadoc tags are not displayed in all IDEs, turned discard/errorMode javadoc tags into plain paragraphs (#2136)
- ๐ [build] #2353 Use
api
for reactive streams api dependency import - โ๏ธ several typos and inconsistencies fixed by various contributors
- ๐ [doc] #2317 Add examples to deprecation notes of processors
- โ [test] Avoid potential infinite busy looping in tests
- ๐ [doc] Polish javadoc of the multicast onBackpressureBuffer Sinks (#2373)
- ๐ [doc] Polish variable names in snippet (#2351)
๐ ๐ Thanks to the following contributors that also participated to this release
-
v3.4.0-M2 Changes
August 11, 2020๐ Reactor-Core
3.4.0.-M2
is part of2020.0.0-M2
Release Train (codenameEuropium
).This second milestone brings several important changes:
- further evolution of the way processors and sinks are obtained and used (following up on the changes initiated in M1)
- ๐ improvements of the
Context
related APIs - ๐ improvements on the
Flux
andMono
metrics
๐ This release note focuses on M2-specific changes, but M2 also contains all the changes released in 3.2.19.RELEASE, 3.3.8.RELEASE and 3.3.9.RELEASE.
โก๏ธ โ ๏ธ Update considerations and deprecations
โก๏ธ Metrics update considerations
๐ท The
name()
operator is no longer used in metrics as a tag but as a prefix for the meter names (#1928):This allows to use custom tags via the
tag()
operator, while ensuring unique enough meter names that all bear the same set of tagsThe
[name].flow.duration
meter has astatus
tag that now differentiate betweencompleted
andcompletedEmpty
(#2313)โก๏ธ This allows to detect eg. empty
Mono
s, but code relying on thecompleted
status should be updated to also takecompletedEmpty
into account.The
[name].subscribed
and[name].requested
meters have had their unit dropped (#1807):๐ The unit is part of the name in some backends like prometheus, but the unit was redundant. So the
requested amount
andsubscribers
unit suffixes have been dropped (separator may vary depending on the metrics backend).โก๏ธ Processors and sinks update considerations
The
FluxIdentityProcessor
andProcessors
classes that were introduced in M1 have been rolled back, andSinks
reworked (#2218)๐ The ultimate goal is to remove the need for processors (or greatly diminish it) and adding processor-related APIs was deemed counterproductive...
The sinks from operators (
FluxSinks
andMonoSink
increate
) no longer have a common interface with the "standalone" sinks. The hierarchy has been simplified and we now have 4 uncorrelated interfaces:FluxSink
andMonoSink
(back to what they were in 3.3, oriented towards subscription-like usage) versusSinks.One
andSinks.Many
(both oriented towards publisher-like usage).๐
Sinks
allow building the later two, with a tiered approach:- chose
many()
vsone()
vsempty()
- Then on
many()
, chose a flavor (unicast()
,multicast()
,replay()
) - Finally, fine tune the flavor to obtain a sink (eg.
Sinks.many().multicast().onBackpressureError()
)
These can also be converted to processors efficiently, as their (private) implementation also implement
FluxProcessor
/MonoProcessor
. NB: to convert from aSinks.Many
/Sinks.One
to a processor where a processor is still relevant, useFluxProcessor.fromSink
andMonoProcessor.fromSink
.The
MonoProcessor
class used to be concrete butfinal
. It is nowabstract
(#1053, #2296)๐ฆ Most of its implementation has been moved to package-private
NextProcessor
. This will allow to introduce more flavors ofMonoProcessor
, focusing that class on signaling aProcessor<A, B>
that is also aMono<B>
.A new flavor
VoidProcessor
, has been also immediately added. It backsSinks.empty()
with less overhead than the oldMonoProcessor
.Sinks.Many
andSinks.One
APIsContrary to operator sinks, these two sinks are to be used more like publisher than like subscribers.
That is to say, they are expected to be passed down
asFlux()
orasMono()
, so generally should accommodate multiple subscribers (except forSinks.many().unicast()
).As a result they expose a different and more restrained API. Most relevant methods are the
emitXxx
methods, which are not fluent but return anEmission
enum.
๐ They can be seen as a "best effort" API, indicating failure through the enum rather than an exception (comparable toQueue#offer
vsQueue#add
in the JDK).๐ฑ โ ๏ธ Consequently, the
Emission
enum should be checked to detect error cases.๐ง For instance, the
EmitterProcessor
used to sleep when its configured buffer was full and users continued trying to emit, effectively busy-looping until the internal queue would accept the pushed valued. This is effectively blocking, and can be problematic (#2049).The equivalent sink,
Sinks.many().multicast().onBackpressureBuffer()
, doesn't sleep/block but immediately returnsEmission.FAIL_OVERFLOW
.Note that to get the old behavior, one can manually loop on the
emitNext
attempt until it returnsEmission.OK
, sleeping for a few nanoseconds when it returnsFAIL_OVERFLOW
. But caller could also decide to fail after a number of retries rather than an infinite loop for instance...Context
APIsContextView
introduction (#2279)Knowing when a
Context
can be "written" vs when it cannot is complicated by the fact that operators that aim at exposing the contextual data only for reading still expose the fullContext
API, with write methods.In M2, we introduce
ContextView
, a superinterface toContext
that only bears the read methods of the context.๐ Operators that expose the context for the purpose of reading from it (and where trying to
put
orremove
data would effectively be a no-op) now have an alternative exposing theContextView
, deprecating the old way:deferWithContext(Function<Context, P>)
is superseded bydeferContextual(Function<ContextView, P>)
- we introduce
transformDeferredContextual(BiFunction<P1, ContextView, P2>)
- ๐ฆ
Signal#getContext()
is superseded bySignal#getContextView()
- ๐
Mono.subscriberContext()
is deprecated. No replacement is planned asdeferContextual(Mono::just)
is a readily available replacement.
A
Context
is already aContextView
. In case an API presents aContextView
but one really need aContext
instead, useContext.of(ContextView)
.๐ Improve naming of context operators (#2148)
๐ In 3.3, context operators are a bit confusing since they're only differentiated by their inputs. In 3.4 we deprecate these confusing names and provide alternatives:
- ๐
Mono.subscriberContext()
is to be removed. UseMono.deferContextual(Mono::just)
instead, or even better try to rewrite the code to fully utilize the capacities ofdeferContextual
andtransformDeferredContextual
operators (which could allow reading from theContextView
only once). - โ
subscriberContext(Context)
is superseded bycontextWrite(ContextView)
(which better conveys that the entries in the input are added to the currentContext
) subscriberContext(Function<Context, Context>)
is superseded bycontextWrite(Function<Context, Context>)
โก๏ธ Other update considerations
- ๐ Methods and classes deprecated in 3.3 have been removed (#2277)
- to help with the
retryWhen
migration from legacy throwable-based function, a second adapter has been added (in both M2 and 3.3 latest release):Retry.withThrowable(Function<Flux<Throwable>, Publisher<?>>)
- to help with the
- ๐
subscribe(..., Consumer<Subscription>)
variant has been deprecated (#1825):- too often, people misuse it to capture or log the
Subscription
but forget torequest
it, resulting in hangs
- too often, people misuse it to capture or log the
Mono.subscribe(valueHandler, errorHandler)
now passed errors in thevalueHandler
to theerrorHandler
(#1995)- โฑ All instances of
Scheduler
are now expected to requirestart()
call before usage (#1789)- the impact is limited as
Schedulers.Factory
-produced instances are started automatically bySchedulers
factory methods (eg.Schedulers.parallel()
or evenSchedulers.newBoundedElastic()
)
- the impact is limited as
- ๐ฆ when encountering
onError
signal AFTERonComplete
/onError
, operators will now default to only logging the extraneousThrowable
(#1431)- Same with a sequence that is
subscribe
without a error handler (#2176). - This can be tuned by setting a
Hooks.onErrorDropped
. The old behavior of throwing would cause issues and used to break the rules of Reactive Streams
- Same with a sequence that is
- All operators that take a
Duration
now do their best to deal with it in nanosecond precision (#1734)- However this means that the maximum interpretable
Duration
is nowDuration.ofNanos(Long.MAX_VALUE)
(down fromofMillis(Long.MAX_VALUE)
. This leaves us with 296 years as the maximum duration, which should be enough for all intents and purposes...
- However this means that the maximum interpretable
- โฑ
Schedulers.newElastic
andSchedulers.elastic()
are now deprecated, to be removed in 3.5
๐ฑ โจ New features and improvements
- ๐ fix #2253 redesign how MetricsRegistry is configured: one can now centrally chose the registry to use instead of micrometer's
globalRegistry
- ๐ fix #2058 identify operators with scheduler through new scannable property (#2123)
- ๐ Allow "0" prefetch value in
concatMap
(#2202) - ๐ fix #2220 Log context access in FINE(ST) level and with correct prefix
- ๐ป Lazily instantiate exception in Mono#repeatWhenEmpty (#2221)
๐ ๐ Documentation, Tests and Build
- ๐ various cleanups in code, documentation, tests and build
- [doc] Document Android 21 desugaring options (#2232)
๐ ๐ Thanks to the following contributors that also participated to this release
-
v3.4.0-M1 Changes
July 01, 2020๐ Reactor-Core
3.4.0-M1
is the first MILESTONE in the2020.0.0-M1
Release Train (codenameEuropium
).๐ Note that in terms of content this milestone is also aligned with what was released in 3.3.7.RELEASE
โก๏ธ โ ๏ธ Update considerations and deprecations
- ๐ Introduce
Sinks
and deprecate concrete processors (#2188)- more detailed migration notes to come
- โฑ Deprecate
Schedulers.elastic
for 3.5 removal (#1893)- This further enforces the use of the
boundedElastic
flavor
- This further enforces the use of the
- โ Remove schedulers deprecated in 3.3 (#2208)
๐ฑ โจ New features and improvements
- ๐ Handle nulls from collectors in
Flux.collect()
(#2181) - Have
push(emitter
) delegate topush(emitter, backpressure)
(#2177) - Align implementations of
MonoCollect
to be comparable toMonoCollectList
(#2186) - โฌ๏ธ Bump the perf baseline to 3.3.6
๐ฑ ๐ Bug fixes
- ๐ Fix input package rule for OSGi metadata generator (#2185)
๐ ๐ Documentation, Tests and Build
- ๐ [build] master is 3.4 Europium, introduce new versioning scheme (#2140)
- ๐ [build] Ensure tools fat jar is the one published (#2189)
- [doc] Make
ParallelFlux
runOn
methods doc consistent about work stealing (#2170) - [doc] Fix 'decided' typo in
coreFeatures.adoc
(#2174)
๐ ๐ Thanks to the following contributors that also participated to this release
@jonenst , @rstoyanchev , @Inego , @gurkerl83
- ๐ Introduce
-
v3.3.12.RELEASE Changes
December 08, 2020๐ Reactor-Core
3.3.12.RELEASE
is part ofDysprosium-SR15
Release Train.๐ This service release contains a couple bugfixes and documentation polishing.
๐ This note focuses on changes specific to this version, but all changes from
3.2.22.RELEASE
are also included.๐ฑ ๐ Bug fixes
- ๐ fix #2519 Cancel propagation on empty collectXxx
- ๐ from 3.2.22.RELEASE:
- fix #2498 Exception thrown in Flux.handle causes hanging in fused case
๐ ๐ Documentation, Tests and Build
- ๐ The
Mono
contract was not sufficiently and explicitly stated in the docs, this has been fixed (#2481) - ๐ Effort around test tooling: switch to JUnit5, remove JUnit4, switch to AssertJ (#2442, #2465, #2467, #2491)
- ๐ Improvements to the javadoc/marble diagrams (#2413, #2289, #2200, #2483, #2509, #2504
- ๐ Improvements to the reference guide:
- โฌ๏ธ Bump to latest generation of plugins for asciidoctor (#2510) + allow forcing rendering of pdf reference guide (97f4e4e)
๐ ๐ Thanks to the following contributors that also participated to this release
-
v3.3.11.RELEASE Changes
October 26, 2020๐ Reactor-Core
3.3.11.RELEASE
is part ofDysprosium-SR13
Release Train.โก๏ธ This is a recommended update for all Reactor 3 users.
๐ This release also contains all changes available in
3.2.21.RELEASE
๐ฑ ๐ Bug fixes
- ๐ fix #2389 Potential integer overflow on BoundedElasticScheduler constructor
๐ ๐ Documentation, Tests and Build
- ๐ fix #2416 Don't blanket hide deprecated members in javadoc
- ๐ fix #2358 correct marbles for transformDeferred
- โฑ [test] Fix flakky boundedElasticScheduler test (#2425)
- โ [test] #2437 migrate tests to junit5
๐ ๐ Thanks to the following contributors that also participated to this release
-
v3.3.10.RELEASE Changes
September 15, 2020๐ Reactor-Core
3.3.10.RELEASE
is part ofDysprosium-SR12
Release Train.๐ This maintenance release contains one small enhancement to
DirectProcessor
/EmitterProcessor
.๐ This version also contains all changes from v3.2.20.RELEASE.
๐ฑ ๐ Bug fixes
- #2356 Have Direct/EmitterProcessor implement currentContext()
๐ ๐ Documentation, Tests and Build
- ๐ [build] #2308 align reactor-tools test output with others projects
-
v3.3.9.RELEASE
August 10, 2020