Major Releases
All the enhancements and features which have been introduced to our major releases of the Axon Framework are noted here.
Release 4.8
Features
[#2689] Support Snapshotting for Polymorphic Aggregates #2753
Allow property based configuration of load balancing strategies #2750
Add
test-summary
step #2745[#1828] Add Anchore Container Scan step #2744
[#2350] JDBC Dead-Letter Queue #2743
Enable tracing in DistributedCommandBus with SpanFactory #2729
Make the token store claim timeout easily configurable. #2722
Allow easy (property) configuration for the
claimTimeout
of the defaultTokenStore
#2708Introduce Polymorphic Aggregate Snapshotting auto-configuration #2689
[#2639] Handler Interceptor support for Dead Letter Processing #2661
[#2640] Support
@ExceptionHandler
and@MessageHandlerInterceptor
annotated methods in Sagas #2656Support
@ExceptionHandler
annotated methods in Sagas #2640Handler Interceptor support for Dead Letter Processing #2639
Add an auto-merge step for Dependabot Pull Request #2608
#2581 Allow to override EventSchema without modifying default JdbcEve… #2582
Allow to override EventSchema without modifying default JdbcEventStorageEngine in Spring context #2581
Allow Development mode on test containers #2461
Autoconfigure automatic load balancing #2453
Enable tracing in DistributedCommandBus with SpanFactory #2403
JDBC Dead-Letter Queue #2350
Validate
test-summary
GitHub Action #2228Investigate usage of the Anchore Container Scan in GitHub Actions #1828
Enhancements
Introduce
AxonServerContainer
as test-container #2763[#2755] Align assertion messages #2757
Put test assertion errors on multiple lines #2755
Add db-scheduler implementation of the Event Scheduler and Deadline Manager #2727
Add db-scheduler implementation of the Event Scheduler and Deadline Manager #2724
Add JCacheAdapter test scenarios #2721
Make Configuration accessible #2700
refactor: Spring Boot 2.x best practices #2663
Improve error message in case a streaming query gives an error. #2662
Error handling of Streaming queries is less than ideal #2660
Add a warning to the creation of the in memory token store. #2650
Add a
registerDeadLetterQueueProvider
method in theEventProcessingConfigurer
. #2633[#2628] Extended support for Spring application context hierarchy #2629
ObjectMapper cannot be resolved from Spring Parent Context #2628
Move AbstractDeadlineManagerTestSuite to spring module so it's deployed. #2622
Clean the test logs #2606
Create a SequencedDeadLetterQueueFactory #2598
#2581 Do not duplicate bean definition of TokenStore #2587
[#2074] Allow to customize saga schema table and columns #2575
Auto-merge successful Dependabot Pull requests #2569
Move to use job builder to have more control how the jobs are stored. Add auto configuration. #2564
Enable
cancelAll
andcancelAllwithinScope
in theJobRunrDeadlineManager
. #2507Add JCacheAdapter test scenarios #2421
Change jdbc column names to snake case as default. #2074
Add cache using EhCache 3 #2709
Add cache using Ehcache 3 #2420
Bug Fixes
Remove payloadType tag from EventProcessorLatencyMetric #2683
Contributors
We'd like to thank all the contributors who worked on this release!
Release 4.7
This release introduces compatibility with Spring Boot 3. The support for Spring Boot 3 also entails the removal of the Jakarta-specific modules since Jakarta is now the default. Furthermore, it required us to duplicate the Javax Persistence and Javax Validation classes into dedicated legacy packages. In doing so, we provided support for both Javax and Jakarta, as well as Spring Boot 2 and Spring Boot 3.
However, this required us to introduce breaking changes in 4.7 compared to 4.6. To help you upgrade towards Axon Framework 4.7, we provide a dedicated Upgrading to Axon Framework 4.7 page describing the scenarios you may be in and the steps to take for upgrading.
Next to the Javax-to-Jakarta adjustments and the Spring Boot 3 support, we've added an Event Scheduler and Deadline Manager based on JobRunr.
For an exhaustive list of the features, enhancements, and bug fixes introduced, see below:
Features
[#1509] Add
whenConstructing
andwhenInvoking
to theAggregateTestFixture
#2551[#2476] Support
EventMessage
handler interceptor registration on theSagaTestFixture
#2548[#2351] The
DeadLetter
Parameter Resolver #2547Add
Configurer#registerHandlerEnhancerDefinition
#2545[#1123] Support
Repository
bean wiring through generics #2527Implement the JobRunr implementation of the event scheduler. #2509
JobRunr
DeadlineManager
#2499Added parameter resolver for aggregate type retrieval from domain event messages #2498
Implement Event Handler Interceptors registration on
SagaTestFixtures
#2476Message Handler (parameter) support for Dead Letters #2351
Alternative deadline manager: JobRunr (Quartz alternative) #2192
Allow the AggregateTestFixture to expect methods to be called instead of commands passed. #1509
Allow replay on a Saga #1458
Provide alternatives for QuartzEventScheduler and QuartzDeadlineManager #1106
Configurable Locking Scheme in SagaStore #947
Enhancements
Fixed SpringAggregateLookup initialization issue for Spring AOT #2578
[#2561] Move Sonar to JDK17 #2574
Automatically approve
dependabot[bot]
PRs #2566Add Segment and Token to UnitOfWork of PooledStreamingEventProcessor #2562
Move Sonar to JDK17 build #2561
[#2129] Fine tune
Repository
registration in theAggregateTestFixture
#2552[#1630] Allow disabling of sequence number generation in the
GenericJpaRepository
#2550Several fixes to successfully run a JDK17 build #2544
Adjust dependabot behavior #2536
Enable heartbeats to Axon Server by default #2530
[#2383] Add
ConditionalOnMissingBean
toSpringAxonConfiguration
andSpringConfigurer
#2526Small test and code improvement for JobRunr deadline manager #2510
Introduce the NestingSpanFactory #2487
Improve mismatch messages for Hamcrest Matchers #2400 #2418
Allow OpenTelemetrySpanFactory to only create child spans #2404
Add ConditionalOnBean to InfraConfiguration Beans #2383
AggregateTestFixture creates EventSourcingRepository and does not invalidate it #2129
JDK16 - axon-messaging own unit test fail on #1826
GenericJpaRepository to enable/disable the sequence number generation #1630
Bug Fixes
Fix typos in Javadoc #2475
Aggregate Repository Spring wiring causes NullPointerException #1123
Asserting checked exception while creating an Aggregate #782
Contributors
We'd like to thank all the contributors who worked on this release!
Release 4.6
Axon Framework 4.6.0 has undergone a great deal of changes. Some noteworthy additions are the Dead-Letter Queue, integrated Tracing with Open Telemetry and Jakarta support. For an exhaustive list of the features, enhancements, and bug fixes with introduced, see below. For a list that also contains the dependency upgrades we refer to this page.
Features
Added Slack release announcement #2348
[#2307] Carry the context during reset to the
ReplayToken
#2312Propagate ResetContext in ReplayToken #2307
[#2198] Add support for Jakarta #2301
Native Tracing for Axon Framework with OpenTelemetry as default #2294
[#2021] Dead Letter Queue for Event Processing Groups #2258
JPA dead letter queue implementation #2239
Construct means to switch between classes using
javax
andjakarta
#2198Create add-dependabot-pr-to-project.yml #2183
Create add-issues-to-project.yml #2182
Multiteant support #2156
Spring event for indication that Axon has started #2146
Application events when handlers are registered #2144
[#1125] Introduce
SagaLifecycle.associationValues()
#2141[#1964] Include
AxonServerHealthIndicator
#2130AggregateTestFixture
improvement - Validate Exception Details #2125AggregateTestFixture
improvement - Validate Exception Details #2110Feature/1466 Additional deadline validation methods #2071
Multi-tenant support #2045
Dead-Letter Queue for Event Processors #2021
Added AxonServerEEContainer and AxonServerSEContainer as an easier way for people to write tests #2020
Streaming query #2001
[#1967] Fetch available segements only from the TokenStore #1997
[#1645] Introduce ObjectNode-to/from-JsonNode
ContentTypeConverter
for theJacksonSerializer
#1995[#1490] Simplify LockFactory configuration for Aggregates #1992
[#1986 Introduce
EventProcessingConfigurer#defaultTransactionManager
method #1989Register default Transaction Manager through Event Processing Configurer #1986
Add method returning the available segments of a TokenStore #1967
Add an actuator health indicator to check the connection between the application and Axon Server #1964
Added the MetaDataSequencingPolicy #1930
Provide a SequencingPolicy based on a MetaData field #1929
Added an option to create a fixture for a state stored aggregate #1772
JsonNode-to-ObjectNode ContentTypeConverter #1645
Simplify LockFactory configuration per aggregate #1490
Additional Deadline Validation methods. #1466
Allow TrackingEventProcessor start to be deferred #1184
Accessing Saga Association Values #1125
Signal when all Handlers have been registered in Spring environment #880
Enhancements
Improve deadline span name. #2360
Make Given-phase Error Handling configurable for Saga Test Fixtures #2356
Improve SpanFactory autoconfiguration mechanism. #2354
Introduce LoggingSpanFactory and MultiSpanFactory #2353
Check if a certain handler contains certain methods before registering it. #2346
Catch exceptions from correlation data providers. #2345
Throw exception on ambiguous dependencies #2344
Integration Test for Command and Query Priority Calculations #2342
Include message identifier in error message if de-serialization fails #2330
Add CorrelationDataProvider error handling on rollback #2328
Strip test prefix once required in JUnit 3 from test method names #2321
Apache Maven Wrapper 3.8.6 #2320
Allow ReplayToken creation to be customizable when resetting a projection #2308
Ensure all dispatchable messages are serialiable by Jackson and Xstream. #2295
Testclasses for javax jakarta extension #2280
Remove redundant method definition #2270
Integration Test for Command and Query Priority Calculations #2266
Update the
PrioritizedRunnable
to aPriorityTask
#2265Automatically add Release Notes on milestone closure to Discuss post #2264
Create a protected method to fetch tracking events on JpaEventStorageEngine #2262
Create a protected method to fetch tracking events on JpaEventStorageEngine. #2259
Allow subtype definition on the
Repository
builders for Polymorphic Aggregates #2250Add test for ConsistentHash.equals #2244
Use getHost instead of getContainerIpAddress #2222
Default snapshotfilter with revision null #2213
Default snapshot filter with revision null #2212
Creation policy factory for Aggregates #2209
Removed deprecated code by updating the default serializer initialization #2206
Flux response type rank matching #2197
Introduce conditional variants for
ApplyMore
#2174Conditional variant for the ApplyMore methods #2173
Take into account the result of the
equals
method before attempting… #2171Improve javadoc of the ReplayStatus enum to reflect changes to the StreamingEventProcessors #2170
MultipleInstancesResponseType should match (lower) on single item #2148
Add duplicate resolution on query handler registration, defaulting to… #2140
Add method on DefaultCommandGateway to be able to customize callbacks #2139
Default Revision
SnapshotFilter
in absence of annotation #2136Fine tune the
MessageHandlerLookup
for Spring Native support #2106Redesign of Spring Boot Auto Configuration support #2105
Feature/1629 saga test fixture #2101
[#2093] Validate if target Command Handling Member can resolve target #2095
Allow several Aggregate Member collections of the same type #2093
Changed logging about "processor falling behind" #2073
Make asDomainEventMessage available to subclasses #2066
Make
JpaEventStorageEngine#asDomainEventMessage(EventMessage<?>)
protected #2065Separate Integration Tests and Aggregate coverage reports #2063
[#1646] Update "No Handler For" exceptional cases #2062
[#1711] Simplify attachment of Lifecycle Operations #2061
Change how Sonar is invoked for GHA's #2033
Introduce LifecycleAware interface for managing component lifecycle #2028
Remove MonoWrapper usage. #2008
Replaced
method.getParametersTypes().length
bymethod.getParameterCount())
#1987Methods for testing deadlines when time passed are consistent in TestExecutor & SagaTestFixture (fixes #1974) #1975
Make methods for testing Deadlines consistent for
TestExecutor
andSagaTestFixture
#1974Added jdk17-ea on our build workflow for early feedback #1915
Add configurable options for checking failure transiency #1910
Prevent stack trace generation for HandlerExecutionException #1905
Allow creation of HandlerExecutionExceptions without stacktrace #1901
[#1898] Empty associationProperty leads to IndexOutOfBoundsException #1899
Empty associationProperty leads to IndexOutOfBoundsException #1898
Provide means of configuring a
CommandCallback
#1889Splitted builds into pr and not pr, added ghactions to dependabot and other minors #1830
Fine tune triggered Deadline validation for Test Fixtures #1797
Simplified DeadlineManager configuration #1796
Expand RetryScheduler to support more granular decision when to retry #1723
Simplify attachment of Lifecycle Operations #1711
Improved termination heuristic when response is < batchsize/2 and the… #1691
Exception in startHandlers is "swallowed" by exception in shutdownHandlers #1669
Fine tune "No Handler For..." Exception #1646
SagaTestFixture should support expectSuccessfulHandlerExecution() #1629
Large number of rolled back transactions on JPA/JDBC TokenStore #1475
Reduce Reflection usage #1427
Add annotation NonNull/Nullable for better usage in kotlin (also java) #1280
Spurious warnings when a tracking token gap appears then is filled #1193
Query handlers of the same name and response type within one class #719
MultipleInstancesResponseType should recognize handler with single result #602
Bug Fixes
Rename SpanFactory.registerTagProvider to registerSpanAttributeProvider #2347
[#2341] Adjust type checking in
SimpleQueryUpdateEmitter
to accompany type erasure #2343UpdateEmitter drops MultipleInstancesResponseType updates due to type checking. #2341
Parameter resolver ordering is wrong for test fixtures #2340
Take all types into account when resolving the deadline handler #2336
When moving to a polymorphic Aggregate the stored Deadlines are not handled. #2333
[#2331] Fix deserialization bug
GrpcBackedSubscriptionQueryMessage
and filter non-handler-matching updates #2332GrpcBackedSubscriptionQueryMessage
overwrites update type with initial response type #2331[#2317] Using deadlines with DefaultConfigurer leads to NPE #2319
Using deadlines with DefaultConfigurer leads to NPE #2317
Fix streaming queries not respecting PriorityTask mechanism #2309
[#2268] Adjust
ConditionalOnClass
to validate existence of theAxonServerConnectionManager
in absence of theaxon-server-connector
package. #2269Bug when using Spring actuator starter and excluding axon server #2268
Support
Cache
andLockFactory
configuration on@Aggregate
stereotype #2254Extracted lambdas to inner static classes #2240
Dependency on reactor is needed to be able to start an Axon app using current 4.6.0-SNAPSHOT #2238
Fix snapshots not being deployed to nexus #2237
fix javadoc: default port is 8124, not 8123 #2223
fix typo in local variable name #2218
Publisher Response Type #2215
EventProcessingModule should lazily initialize processors #2180
Fix
StreamingEventProcessor#maxCapacity
for theTrackingEventProcessor
#2124Restore missing commit 6e531a6cf173243adf9519905f42cbec0a334238 #2116
Wire eventSerializer into QuartzEventSchedulerFactoryBean #2115
Wire the event
Serializer
intoQuartzEventSchedulerFactoryBean
#2088Fix typo in pom.xml #2022
Fix typos #2016
Exponential Retry for Tracking event processor not happening for transient exceptions when using postgres JdbcTokenStore #1920
Contributors
We'd like to thank all the contributors who worked on this release!
Release 4.5
This release has seen numerous addition towards Axon Framework. The most interesting adjustments can be seen down below. Note that the BOM (as marked in #1200) is not part of the release notes, as this will use its own separate release cycle. For those interested, the BOM repository can be found here.
For an exhaustive list of all adjustments made for release 4.5 you can check out this page.
Enhancements
A new type of
EventProcessor
has been introduced in pull request #1712, called thePooledStreamingEventProcessor
. ThisEventProcessor
allows the same set of operations as theTrackingEventProcessor
, but uses a different threading approach for handling events and processing operations. In all, this solution provides a more straightforward processor implementation and configuration, allowing for enhanced event processing in general. For specifics on how to configure it, check out this section.Sagas support the use of Deadline Handlers, but an
@DeadlineHandler
annotated method couldn't automatically close a Saga with the@EndSaga
annotation. This enhancement has been described in #1469 and resolved in pull request #1656. As such, as of Axon 4.5, an@DeadlineHandler
annotated can also be annotated with@EndSaga
, to automatically close the Saga whenever the given deadline is handled.Whenever an application uses snapshots, the point arises that old snapshot versions need to be invalidated when loading an Aggregate. To that end the
SnapshotFilter
can be configured. As a simplified solution, the@Revision
annotation can now be placed on the Aggregate class to automatically configure a revision basedSnapshotFilter
. Due to this, old snapshots will be filtered out automatically when an Aggregate is reconstructed from theEventStore
. For those interested, the implementation of this feature can be found here.At the basis of Axon's message handling functionality, is the
MessageHandlingMember
. For the time being, the sole implementation of this is theAnnotatedMessageHandlingMember
, which expect the use of annotations like the@CommandHandler
and@EventHandler
, for example. As a step towards constructing an annotation-less approach, #1621 was introduced into the framework. The first steps taken in this pull request are the deprecation of annotation-specific methods from theMessageHandlingMember
interface. Added to this is a new approach towards defining attributes of a message handling member throughHandlerAttributes
.
Bug Fixes
In issue #1733 a confusion around the
EventUtils#asDomainEventMessage
was described. This reiterated the fact that this method is purely intended for internal use inside Axon Framework, which was not clear to the users. As such, it has now been deprecated, containing a clear statement why this method is not to be used.
Release 4.4
Enhancements
Axon Framework can now be used in conjunction with Spring Boot Developer Tools. You can simply achieve this by adding the required dev-tools dependency to your project.
As a partial solution to #1106, Axon Server can now be used to schedule events. Building an
AxonServerEventScheduler
as theEventScheduler
implementation as defined through the builder is sufficient to start with scheduling events through Axon Server.An
EventTrackerStatusChangeListener
can now be configured for aTrackingEventProcessor
, as was requested in #1338. It can be configured through theTrackingEventProcessorConfiguration
, allowing users to react upon status changes of each thread processing event messages.Component specific message handler interceptors can now be defined through a dedicated annotation: the
@MessageHandlerInterceptor
annotation. This annotation allows you to introduce a specific bit of logic to be invoked prior to entering the message handling function or after invocation. It for example allows the additional introduction of a@ExceptionHandler
annotation, allowing you to specifically deal with the exceptions thrown from your message handlers. The original pull request can be found under #1394. For more specifics on using this annotation, check ou the @MessageHandlerInterceptor section.Configuring a
Snapshotter
andSnapshotFilter
have been simplified in this release. Pull request #1447 shares the load of allowing for distinctSnapshotter
configuration. Issue #1391 describes the intent to the configuration of snapshot filtering to be performed on Aggregate level. The former can be configured through theConfigurer
, whereas the latter is by usage of theAggregateConfigurer
.
Bug Fixes
The
AggregateTestFixture
was incorrectly noting an old method in one of its exceptions. This has been marked and resolved in #1428.The
CommandValidator
andEventValidator
had a minor discrepancy; namely, theCommandValidator
cleared out contained commands upon starting whereas theEventValidator
didn't. Pull request #1438 resolved the problem at hand.
For a full list of all the feature request and enhancements done for release 4.4, you can check out this page.
Release 4.3
Enhancements
Aggregate Polymorphism has been introduced, allowing for an aggregate hierarchy to come naturally from a domain model. To set this up, the
AggregateConfigurer#withSubtypes(Class... aggregates)
method can be used. In a Spring environment, an aggregate class hierarchy will be detected automatically. For more details on this feature, read up on it here.An Axon application will now shutdown more gracefully than it did in the previous releases. This is achieved by marking specific methods in Axon's infrastructure components as a
@StartHandler
or@ShutdownHandler
. A 'phase' is required in those, specifying when the method should be executed. If you want to add your own lifecycle handlers, you can either register a component with the aforementioned annotations or register the methods directly throughConfigurer#onInitialize
,Configuration#onStart
andConfiguration#onShutdown
.We have introduced the
@CreationPolicy
annotation which you can add to@CommandHandler
annotated methods in your aggregate. Through this, it is possible to define if such a command handler should 'never', 'always' or 'create' an aggregate 'if-missing'. For further explanation read the Aggregate Command Handler Creation Policy section.Both the
XStreamSerializer
andJacksonSerializer
provide a means to toggle on "lenient serialization" through their builders.Various test fixture improvements have been made, such as options to register a
HandlerEnhancerDefinition
, aParameterResolverFactory
and aListenerInvocationErrorHandler
. Additional validations have been added too, revolving around asserting scheduled events and deadline message. The Test Fixture page has been updated to define these new operations accordingly.The
TrackingEventProcessor#processingStatus
method as of 4.3 exposes more status information. The current token position, token-at-reset, is-merging and merge-completed position have been added to the set. Read the Event Tracker Status section for more specifics on this.
Bug Fixes
A
ConcurrencyException
was thrown when an aggregate was created at two distinct JVM's at the same time. AsConcurrencyException
s are typically retryable, the creation command would be issued again if aRetryScheduler
was in place. Retrying this operation is however useless and hence has been replaced for anAggregateStreamCreationException
in pull request #1333.The test fixtures for state-stored aggregates did unintentionally not allow resource injection. This problem has been resolved in pull request #1315.
The
MultiStreamableMessageSource
did not deal well with one or several exceptional streams. Hence exception handling has been improved on this matter in #1325.
For a complete list of all the changes made in 4.3 you can check out this page.
Release 4.2
Enhancements
Axon Framework applications can now use tags to support a level of 'location awareness' between Axon clients and Axon Server instances. This feature is further described here.
Axon Server already supported several contexts, but Axon Framework application could not specify to which context message should be dispatched. The Axon Server Connector has been expanded with a
TargetContextResolver
to allow just this.A new implementation of the
StreamablbeMessageSource
has been implemented: theMultiStreamableMessageSource
. This implementation allows pairing several "streamable" message sources into a single source. This can in turn be used to for example read events from several distinct contexts for a single Tracking Event Processor.Handler Execution Exception now allow application specific information to be sent back over the wire in case of a distributed set up.
The
TrackingToken
interface now provides an estimate of it's relative position in the event stream through theposition()
method.Optional
return types can now be used for Query Handling methods.
Bug Fixes
An Aggregate's
Snapshotter
was not auto configured when Spring Boot is being used, as was filed under #932.The
CommandResultMessage
was returned asnull
when using theDisruptorCommandBus
. This was solved in pull request #1169.The
ScopeDescriptor
used by theDeadlineManager
had serialization issue when a user would migrate from an Axon 3.x application to Axon 4.x. Theaxon-legacy
package has been expanded to contain legacyScopeDescriptor
s to resolve this problem.
For a full list of all features, enhancements and bugs, check out the issue tracker.
Release 4.1
Enhancements
The
TrackingEventProcessor
now has an API to split and mergeTrackingTokens
during runtime of an application. Axon Server has additions to the UI to split and merge a given Tracking Event Processor's tokens.Next to Dropwizard metrics the framework now also supports Micrometer metrics. The
MessageMonitor
interface is used to allow integration with Micrometer. Lastly, we are incredibly thankful that this has been introduced as a community contribution.Primitive types are now supported as
@QueryHandler
return types.We have introduced the
EventGateway
in a similar fashion as theCommandGateway
andQueryGateway
. As with the command and query version, theEventGateway
provides a simpler API when it comes to dispatching Events on theEventBus
.
Bug Fixes
Command and Query message priority was not set correctly for the Axon Server Connector. This issue has been addressed under bug #1004.
The
CapacityMonitor
was not registered correctly for Event Processor, which user "Sabartius" resolved under issue #961.Some exception were not reported correctly and/or clearly when utilizing the Axon Server Connector (issue marked under number #945).
We refer to this page for a full list of all the changes.
Release 4.0
Enhancements
The package structure of Axon Framework has changed drastically with the aim to provide users the option to pick and choose. For example, if only the messaging components of framework are required, one can directly depend on the
axon-messaging
package.In part with the package restructure, all components which leverage another framework to provide something extra have been given their own repository. These repositories are called the Axon Framework Extensions.
The configuration of Event Processor has been replaced and greatly fine tuned with the addition of the
EventProcessingConfigurer
.Some new defaults have been introduced in release 4.0, like a bias towards expecting a connection with Axon Server. Another important chance is the switch from defaulting to Tracking Processors instead of Subscribing Processors.
The notion of a
CommandResultMessage
has been introduced as a dedicated message towards the result of command handling.To simplify configuration and more easily overcome deprecation, the Builder pattern has been implemented for all infrastructure components.
Bug Fixes
The bugs marked for release 4.0 were issues introduced to new features or enhancements. As such they should not have impacted users in any way. Regardless, the full list can be found here.
For more details, check the list of issues here.
Last updated