Minor Releases
最后更新于
最后更新于
Any patch release made for an Axon project is tailored towards resolving bugs. This page aims to provide a dedicated overview of patch releases per project.
This release brings three adjustments worth mentioning to the framework, namely:
Contributor oysteing
opened issue , describing that the ReplayStatus
enumeration never entered the REPLAY
status for a PooledStreamingEventProcessor
. We resolved this finding in pull request by ensuring the TrackingToken
carries the replay status as intended.
The AggregateTestFixture
incorrectly assumed a test succeeded in the absence of an exception when you would use the expectExceptionMessage
validation step. We resolved this predicament in pull request .
Lastly, we further upgraded the XStream dependency for a CVE in pull request. This time, for .
For an exhaustive list of the changes in 4.5.9, we refer to the .
This release brings two adjustments worth mentioning to the framework. Namely:
We spotted a bug within the PooledStreamingEventProcessor
(PSEP). More specifically, whenever a subset of the tokens for the PSEP existed, calculating the lower bound of a token would cause failures. We addressed this predicament in pull request .
We introduce an enhancement in the API of the CommandGateway
. You can now directly insert MetaData
whenever using the CommandGateway#send
or CommandGateway#sendAndWait
operations. You can verify the changes .
This contains a single fix. Namely, pull request . This pull request solves a bug that had the PooledStreamingEventProcessor
not handle new events resulting from an EventMultiUpcaster
. The kudos for spotting the bug go to , which started a discussion on our after he noticed the issue.
General improvements on the PooledStreamingEventProcessor
made across several Pull Requests.
Release 4.4.9 of Axon Framework has incremented all used dependencies towards their latest bug release. This has done to resolve potentially security issues, as was reported with XStream 1.4.14 (that was resolved in 1.4.16).
A new SnapshotTriggerDefinition
called AggregateLoadTimeSnapShotTriggerDefinition
has been introduced, which uses the load time of an aggregate to trigger a snapshot creation.
The TrackingEventProcessor#mergeSegment(int)
method was invoked with the high segment number of the pair to merge,
an error would occur in the process as it expected to receive the lower number on all scenarios.
A small connectivity adjustment which was performed in the AxonServerConnectionManager
for bug release 4.3.4 has been reverted.
Although it worked successfully for some scenarios, it did not correctly cover all possibilities.
The full scenario will be covered through the adjusted connector which is underway for beta release in 4.4.
Snapshots were incorrectly created in the same phase as the publication of events.
When using the SequenceEventStorageEngine
to merge an active and historic event stream there was a discrepancy when the active stream didn't contain any events and the historic stream did.
When using the QueryGateway
, it was not possible to provide a QueryMessage
as the query field since the queryName
would be derived from the class name of the provided query.
Hence, QueryMessage
would be the queryName
, instead of the actual queryName
.
There was a window of opportunity where the Snapshotter
would publish the last event in its stream twice.
This could cause faulty snapshots in some scenarios.
The bi-directional stream created by the Axon Server Connector wasn't always closed correctly; specifically in error cases.
feature a bug was introduced which didn't allow non-String aggregate identifiers.
allowing the usage of "complex" aggregate identifiers once more.
The graceful shutdown process introduced in 4.3 had a couple of minor problems.
One of which was the shutdown order within the AxonServerCommandBus
and AxonServerQueryBus
,
which basically made it so that the approach prior to 4.3 was maintained.
We also noticed that the AxonServerConnectionManager
never shutdown nicely.
The AggregateCreationPolicy#ALWAYS
did not behave as expected, resulting in faulty behaviour when used.
ensuring the desired usage of all newly introduced creation policies.
In a distributed setup, the DisruptorCommandBus
was not always correctly identified as being the local segment.
Due to this, aggregate repositories weren't created by the DisruptorCommandBus
as is required in such a configuration.
a query handler with return type Future
was not being returned at all but threw an exception.
An issue was solved where the JdbcAutoConfiguration
unintentionally depended on a JPA specific class.
A one-to-many Upcaster
instance tied to Axon Server would only use the first event result and ignore the rest.
The axon-legacy
module's GapAwareTrackingToken
did not implement the TrackingToken
interface.
The builders of the ExponentialBackOffIntervalRetryScheduler
and IntervalRetryScheduler
previously
did not implement the validate()
method correctly.
Through this a NullPointerException
could occur on start-up,
A dependency on XStream
was enforced undesirably through the Builder pattern introduced in 4.0.
Due to a hierarchy issue in the Spring Boot auto configuration, the JdbcTokenStore
was not always used as expected.
The ordering of message handling functions was incorrect according to the documentation.
When Axon Server was (auto) configured without being able to connect to an actual instance, processing instructions were incorrectly dispatched regardless.
The Spring Boot auto configuration did not allow the exclusion of the axon-server-connector
dependency due to a direct dependency on classes.
The JpaEventStorageEngine
was not wrapping the appendEvents
operation in a transaction.
Resolved an issue where custom exception in a Command Handling constructor caused NullPointerExceptions
.
The SimpleQueryBus
reported exceptions on the initial result incorrectly upon performing a subscription query.
Resolved issue where the the "download Axon Server" message was shown upon a reconnect of an application to a Axon Server node.
Fixed inconsistency in the GlobalSequenceTrackingToken#covers(TrackingToken)
method.
Although Axon Framework doesn't use the log4j-core dependency directly, we updated it to the most recent version for ease of mind. You can follow these increments in issues , and .
Contributor jasperfect
spotted a predicament with duplicate aggregate creation combined with using caches. Axon didn't invalidate the cache as it should have, causing unexpected behavior. You can find the issue description . Additionally, you can find the pull request solving the problem .
Contributor shubhojitr
stated in issue that the axonserver-connector-java
project pulled in a non-secure version of grpc-netty
. As this isn't an issue on Axon Framework itself, we solved the problem under the connector project. As a follow-up, we incremented the framework's version for the axonserver-connector-java
project to 4.5.4, which contains the most recent version of the grpc-bom
.
For an exhaustive list of all the changes, check out the .
The auto-configuration we introduced for XStream
used a suboptimal approach. We assumed searching for the @ComponentScan
would suffice but didn't consider that Spring enabled SpEL operations in the annotation's properties. This approach thus caused some applications to break on start-up. As such, this approach is replaced entirely by using the outcome of the AutoConfigurationPackages#get(BeanFactory)
method. For those interested in the details of the solution, check out pull request. Kudos to contributor maverick1601
for drafting issue explaining the predicament.
We introduced an optimization towards updating the TrackingToken
. In (distributed) environments where the configuration states several segments per Streaming Processor, there are always threads receiving events that they're not in charge of due to the configured SequencingPolicy
. The old implementation eagerly updated the token in such scenarios, but this didn't benefit the end-user immediately. Pull request introduce a wait period for 'event-less-batches', for both the TrackingEventProcessor
and PooledStreamingEventProcessor
. This adjustment minimizes the number of token updates performed by both processor implementations.
The introduction of Spring Boot version 2.6.0 brought an issue to light within Axon's Spring usage. The AbstractAnnotationHandlerBeanPostProcessor
took FactoryBean
instances into account when searching for message handling methods. This approach, however, is not recommended by Spring, which they enforced in their latest release. The result was circular dependency exceptions on start-up whenever somebody used Spring Boot 2.6.0. The fix was simple, though, as we should simply ignore FactoryBean
instances. After spotting the issue, we resolved it in pull request.
For an exhaustive list of all the changes, check out the .
First and foremost, we updated the XStream version to 1.4.18. This upgrade was a requirement since several were noted for XStream version 1.4.17. As a consequence of XStream's solution imposed through the CVE's, everybody is required to specify the security context of an XStream
instance. This change also has an impact on Axon Framework since the XStreamSerializer
is the default serializer. So as of this release, any usages of the default XStreamSerializer
will come with warnings, stating it is highly recommended to use an XStream
instance for which the security context is set through types or wildcards. When your application uses Spring Boot, Axon will default to selecting the secured types based on your @ComponentScan
annotated beans (e.g., like the @SpringBootApplication
annotation). For those interested in the details of the solution, check out pull request.
User 'nils-christian' noted in issue that Axon executed Upcaster beans in a Spring environment in the incorrect order. This ordering issue was due to a misconception in deducing the @Order
annotation on upcaster beans. We resolved the problem in pull request .
We noticed a TokenStore
operation that Axon did not invoke within a transaction. In most scenarios, this worked out, but when using Micronaut, for example, this (correctly) caused an exception. After spotting the issue, we resolved it in pull request.
For an exhaustive list of all the changes, check out the .
One new feature has been introduced in 4.5.3: the PropertySequencingPolicy
by contributor nils-christian
. This can be configured to look for a common property in the events.
The version of the axonserver-connector-java
has been updated to 4.5.2. This update resolves a troublesome issue around permit updates for subscription queries, which exhausted the number of queries an application could have running. For those curious about the solution, pull request addresses this issue.
The WorkerLauncher
runnable, used by the TrackingEventProcessor
to start its threads, was not considered when you shut down a tracking processor. As a consequence, it could start new segment operations while shutdown
already completed "successfully." Pull request resolves this problem, ensuring a tracking processor shuts down as intended.
Issue describes an issue where the always
. Exceptions thrown from within a command handler annotated with @CreationPolicy(ALWAYS)
weren't correctly propagated. Pull request solves this issue.
For an exhaustive list of all the changes, check out the .
Added a missing isReplaying
flag on the StreamingEventProcessor
. Pull request reintroduces this functionality in this release.
Some enhancements in regards to logging Exceptions and stacktraces when initialization fails. This reintroduces this functionality in this release.
Improved Axon Framework (AxonServerEventStore
) which will now rethrown Exceptions that has a valid Status.Code
. Pull request reintroduces this functionality in this release.
For a detailed perspective on the release notes, please check page.
Some internals have changed concerning command handling exceptions. Within a single JVM, Axon Framework knows whether the exception is transient or not. This piece of information allows the to retry a non-transient exception since those are retryable. With the move towards distributed environments, the information whether an exception is transient was lost when we moved to the dedicated CommandHandlingException
containing a details object. Pull request reintroduces this functionality in this release.
The new RevisionSnapshotFilter
introduced in release 4.5 sneaked in a bug by not validating the aggregate type upon filtering. Pull request describes and solves the problem by introducing the aggregate type to the RevisionSnapshotFilter
.
By enabling the for the , a timing issue was introduced with handling events. Contributor "junkdog" marked the problem in issue , after which pull request solved it.
Contributor "michaelbub" noted in issue that resetting a StreamingEventProcessor
to a point in the future reacted differently when no token was stored yet. This followed from the implementation of the ReplayToken
, which wrongfully assumed that if the given 'token at reset' was null
, the start position should be null
too. However, the start position might be the future, and hence it should be used in favor of null
. This issue is addressed under pull request.
For a detailed perspective on the release notes, please check page.
For those looking for the set of adjustments please take a look at tag
A bug was noted whenever a query handler returned a Future
/CompletableFuture
in combination with a subscription query, with Axon Server as the infrastructure. In this format, Axon would incorrectly use the scatter-gather query for the initial result of the subscription query. Whenever the returned result was completed, this didn't cause any issues. However, for a Future
/CompletableFuture
a TimeoutException
would be thrown. The issue was luckily easily mitigated by changing the "number of expected results" from within the QueryRequest
to default to 1 instead of zero. As an effect, the point-to-point would be invoked instead of scatter-gather. For reference, the issue can be found .
Whenever an interface is used as the type of an @AggregateMember
annotated field, Axon would throw a NullPointerException
. This is far from friendly, and has been changed towards an AxonConfigurationException
in pull request .
Note that the named issues comprise the complete changelist for .
The version 4.4.7 has been included in this release as well. As such, it's fixes (found ) are thus also part of this release.
Contributor "krosenvold" noticed that the SQL to retrieve a stream of events was performed twice in quick concession. The provided solution (in pull request ) would resolve this, but the problem was spotted to originate elsewhere. Commit saw an end to this occurrence by making a minor tweak in the EmbeddedEventStore
.
As rightfully noticed by user "pepperbob", there was a type discrepancy when reading events through a tracking token. An event would always become a DomainEventMessage
when read through the EventStorageEngine
, whereas it might originally have been a regular EventMessage
. The problem has been fixed in commit . Furthermore, the entire description of the issue can be found .
Through the use of the AxonServerQueryBus
, a cancelled subscription query was wrongfully completed normally where it should complete exceptionally. This problem is marked and resolved under pull request .
For a detailed perspective on the release notes, please check page.
Contributor "Rafaesp" noted that a registered CommandHandlerInterceptor
in the AggregateTestFixture
could be invoked more often than desired. This only occurred if the fixture's givenCommands(...)
method was invoked, but nonetheless this behaviour was incorrect. The issue is marked under and resolved in pull request .
In 4.4.4, a fix was introduced which ensured a ChildEntity
(read, the Aggregate Members) was no longer duplicated in an aggregate hierarchy. This fix had the troublesome side effect that aggregate member command handlers weren't registered on every level of the aggregate hierarchy anymore. The resolution to this problem can be found in pull request .
Using the subscription query in a distributed environment had a possible troublesome side effect. If a consumer of updates was closed for whatever reason, it could also close the producing side. This is obviously undesired, as no single consumer should influence if the producer should still dispatch updates to other consumers. The problem was marked under issue and resolved in commit.
Right before we aimed to release 4.4.6, contributor "haraldk" provided a thorough issue description when using the SequenceEventStorageEngine
. He noted that if snapshots were used for an aggregate, there was a window of opportunity that the 'active' EventStorageEngine
in the sequencing engine did not return any events. This followed from the sequence number logic, which wrongfully defaulted to position "0", even though the starting sequence number is per definition higher if a snapshot has been found. The clarifying issue can be found , with its resolution present in pull request .
For a complete overview of all the changes you can check the release notes .
When creating a TrackingToken
at a certain position through StreamableMessageSource#createTokenAt(Instant)
, a tail token was wrongfully returned if the provided timestamp exceeded the timestamp of the last event. Instead, the token closests to the provided timestamp should be returned, was equals the head token. This discrepancy between documentation and implementation was marked by mbreevoort
and resolved in pull request .
A certain path within the AxonServerEventStore
allowed for event retrieval without correctly deserializing the MetaData
of the events. If someone tried to access the MetaData
, a CannotConvertBetweenTypesException
was being thrown. This problem, among others, was remedied in pull request , by ensuring the correct Serializer
taking gRPC message types into account is consistently used.
For a complete set of the release notes, please check .
There was a bug which made it so that an @ResetHandler
annotated method without any parameters was included for validation if a component could handle a specific type of event. This exact validation is used to filter out events from the event stream to optimize the entire stream. The optimization was thus mitigated by the simple fact of introducing a default @ResetHandler
. The problem was marked by @kad-hesseg
(for which thanks) and resolved in pull request .
When using an aggregate class hierarchy, @AggregateMember
annotated fields present on the root would be duplicated for every class in the hierarchy which included message handling functions. This problem was traced back to the AnnotatedAggregateMetaModelFactory.AnnotatedAggregateModel
which looped over an inconsistent set of classes to find these members. The issue was marked by @kad-malota
and resolved in pull request .
For a complete set of the release notes, please check .
An optimization in the snapshotting process was introduced in pull request . This PR ensures no unnecessary snapshots are staged in the AbstractSnapshotter
by validating none have been scheduled yet. This fix will resolve potential high I.O. when snapshots are being recreated for aggregates which have a high number of events.
The assignment rules used by the EventProcessingConfigurer
weren't always taken into account as desired. This inconsistency compared to regular assignment through the @ProcessingGroup
annotation has been resolved in pull request.
Heartbeat messages between Axon Server and an Axon Framework application were already configurable, but only from the server's side. Properties have been introduced to also enables this from the clients end, as specified further in pull request. Enabling heartbeat messages will ensure the connection is preemptively closed if no response has been received in the configured time frame.
To check out all fixes introduced in 4.4.3, you can check them out on page.
A persistent loop of 500ms was spotted during event consumption from Axon Server. Credits go to Damir Murat who has spotted the . With his help the issue was found quickly and eventually resolved in pull request .
A serialization issue was found when working with the ConfigToken
and de-/serialize it through the JacksonSerializer
. This problem was uncovered in issue and resolved in pull request .
The introduction of the to simplify the framework's integration with Axon Server introduced some configuration issues. For example, the AxonServerConfiguration#isForceReadFromLeader
wasn't used when opening an event stream (resolved in PR ).
Furthermore, properties like the max-message-size
, gRPC keep alive settings and processorNotificationRate
weren't used when forming a connection with Axon Server. This issue was covered by pull request .
page shares a complete list of all resolved issues for this release.
A single fix was performed as soon as possible to release 4.4, in conjunction with the new used by this release. There was an off by one scenario when an Event Processor started reading events from the beginning of time. This meant that the first event in the event store was systematically skipped. The bug was resolved in commit.
This was resolved in pull request .
The commit can be found for reference.
For a complete list of all resolved bugs we refer to the .
Whilst adjusting the JdbcEventStorageEngine
in to allow more flexibility to configure the used statements, we accidentally dropped support for adjusting how the store wrote timestamps.
This issue was rectified by user ovstetun
in pull request .
This has been moved to the after commit phase of the UnitOfWork
in issue .
This has been resolved in pull request .
For a complete list of all resolved bugs we refer to the .
This bug release contained a single fix, under pull request . A situation was reported where a Tracking Event Processor did not catch up with the last event, until a new event was available after that event. Effectively causing it to read up to N-1. This only accounted for usages of the MultiStreamableMessageSource
, thus when two (or more) event streams were combined into a single source for a TrackingEventProcessor
.
To remain complete, is the issue tracker page contained the closed issues for release 4.3.3.
This issue has been resolved in .
This issue was marked under and resolved in pull request .
This problem has been resolved in pull request .
For a complete list of all resolved bugs we refer to the .
Through the new
This problem was quickly resolved in ,
All of these, plus some other minor fixes, have been performed in .
Pull request saw an end to this problem,
For a complete list of all resolved bugs we refer to the .
This was marked in and resolved through .
As described in ,
Pull request solved that in 4.2.2.
For a complete list of all resolved bugs we refer to the .
This issue has been resolved in pull request .
This was marked in issue and resolved in .
as marked in .
For a complete list of all resolved bugs we refer to the .
This has been resolved by using a Supplier
of a Serializer
in the Builders instead, as described under issue.
The ordering has been fixed under issue .
Classes take precedence over interface, and the depth of interface hierarchy is calculated based on the inheritance level (as described ).
For a complete list of all resolved bugs we refer to the .
Query Dispatch Interceptors were not called correctly when a was performed when Axon Server was used as the QueryBus
.
This issue was marked and resolved in pull request .
Pull request resolves this by making sure an active connection is present.
This has been resolved by expecting fully qualified class names as Strings instead (resolved under pull request).
Problem has been resolved under issue .
For a complete list of all resolved bugs we refer to the .
Deserialization failures were accidentally swallowed by the command and query gateway (marked under ).
For a complete list of all resolved bugs we refer to the .
Issue has been described and resolved under .
Large global index gaps between events caused issues when querying the event stream (described ).
For a complete list of all resolved bugs we refer to the .
A timeout was thrown instead of a exception by Axon Server when a duplicate aggregate id was created, which is resolved in .
Command or Query handling exceptions were not properly serialized through Axon Server (resolved in ).
For a complete list of all resolved bugs we refer to the .
Resolved QueryUpdateEmitter
configuration for the Axon Server connector set up (see issue ).
For migration purposes legacy TrackingTokens
should have been added, which is resolved .
Event Processing was stopped after a reconnection with Axon Server. Resolve the problem in issue .
For a complete list of all resolved bugs we refer to the .