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.

Release 5.2

Release 5.2.3

Bug fixes

  • Back off before reopening a stream whose source failed (#4839, PR #4840, by @laura-devriendt-lemon)

  • Fix bug where publish future could complete before events are visible (PR #4850, by @hjohn)

  • Invoke MessageStream callbacks outside the stream lock (PR #4868, by @CodeDrivenMitch)

Contributors

A heartfelt thank you to all contributors who worked on this section:

Release 5.2.2

Bug fixes

  • Reopen the event stream when its source completed it #4785

Contributors

A heartfelt thank you to all contributors who worked on this section:

Release 5.2.1

Bug fixes

  • Validate return and parameter type against field type (PR #4780, by @smcvb)

  • Only deduplicate fluent accessors for records (PR #4779, by @smcvb)

  • Active entities should only receive tag-matching events during command handling phase ([#4766, [PR #4773, by @MateuszNaKodach)

  • Resolve incorrect event routing in heterogeneous Sequencing Policy setup among Event Handling Components (PR #4771, by @MateuszNaKodach)

  • Only resolve replay context during an active replay (PR #4754, by @abuijze)

  • Do not report rolled-back events in AxonTestFixture (PR #4749, by @abuijze)

Documentation

  • Fix navigation item for the dataprotection-extension migration path (PR #4741, by @hatzlj)

  • Include AF 5.2.0 release notes (PR #4734, by @smcvb)

Contributors

A heartfelt thank you to all contributors who worked on this section:

Release 5.1

Release 5.1.2

Non-annotated nested message classes now resolve to package.SimpleName instead of package.Outer$SimpleName. See Nested message class names for how this affects existing applications.

Features

  • feat(migration): preserve AF4 MessageOriginProvider metadata key names in AF5 #4613

Enhancements

  • [#3195] feat(migration): fix Kotlin OpenRewrite migration gaps #4605

Bug fixes

  • [#4643 | Port] AggregateBasedJpaEventStorageEngine#stream loops until StreamingCondition matching events are retrieved #4686

  • [#4625 | Port] Introduce the EventTypeResolver for EventStorageEngines | Allows for default versions #4672

  • [#4634 | Port] Register the Micrometer MetricsConfigurationEnhancer only once when using Spring Boot #4671

  • Port (5.1.x): [#4647] Propagate all entry resources to per-event ProcessingContext #4670

  • fix(messaging): disposing a Flux does not close the underlying subscription query #4667

  • Avoid costly stack walk on every task start in AxonTimeLimitedTask #4655

  • fix(migration): honor skipTests property #4631

  • Align QualifiedName#(Class) outcome with annotated approach for nested classes #4630

  • test(eventsourcing): assert event metadata is preserved when sourcing aggregate-based events #4628

Contributors

We’d like to thank all the contributors who worked on this release!

Nested message class names

Up to 5.1.1, a nested class that was not annotated with @Command, @Event, or @Query resolved to its binary name (for example example.DocumentEvent$DocumentCreated). As of 5.1.2, it resolves to example.DocumentCreated, as annotated classes already did. Top-level and annotated classes are not affected, and neither are names passed as a String, such as new MessageType("example.DocumentEvent$DocumentCreated", version). Gateways or other components that build a MessageType from Class#getName() now dispatch under a different name than the handlers are registered under, resulting in a NoHandlerForCommandException.

Events stored under the old name are no longer matched by handlers and EventCriteria using the new name. No stored-data migration is needed, as the stored name remains as-is. Instead, pin the old name on the nested class:

public sealed interface DocumentEvent {

    @Event(namespace = "example", name = "DocumentEvent$DocumentCreated", version = "0.0.1")
    record DocumentCreated(String id) implements DocumentEvent {
    }
}

The version must match the one stored with the events. Annotations are only honored by the AnnotationMessageTypeResolver, the default, so a replaced MessageTypeResolver must take them into account.

To keep binary names for all non-annotated classes instead, configure an AnnotationMessageTypeResolver with a fallback:

MessagingConfigurer.enhance(applicationConfigurer)
    .registerMessageTypeResolver(config -> new AnnotationMessageTypeResolver(
        payloadType -> Optional.of(new MessageType(payloadType.getName(), MessageType.DEFAULT_VERSION))
    ));

This also applies to events stored after upgrading, so prefer pinning per class when events were already persisted under the new names.

Pinning alone is not sufficient if events were already stored under the new name (example.DocumentCreated). Handlers match on the QualifiedName only, so after pinning they register solely under example.DocumentEvent$DocumentCreated. Events stored under the new name are then silently skipped: event processors filter them out, and evolve on an event-sourced entity finds no handler and ignores them. Nothing fails, so projections and entities simply miss state. Events dispatched after pinning use the old name again, leaving the store with a mix of old, new, and old names.

When events exist under both names, either:

  1. Add a handler per name. Annotate a second handler with the new name through @EventHandler(eventName = "example.DocumentCreated"). As @EventSourcingHandler has no eventName attribute, an entity needs a plain @EventHandler(eventName = …​) for the second name. Any @EventCriteriaBuilder filtering on types needs to list both names.

    @EventHandler
    void on(DocumentCreated event) { ... }
    
    @EventHandler(eventName = "example.DocumentCreated")
    void onNew(DocumentCreated event) { ... }
  2. Rename the event through an event transformation (Axoniq Framework 5.2+). A rename(from, to) from example.DocumentCreated to the pinned name makes the existing handlers work unchanged. Type-filtered EventCriteria get the old name added automatically.

Instances resolving a nested class to different names cannot exchange messages. For a rolling upgrade, first pin the old names on the new version, so all instances share identical names, and drop the pinning only when all instances run the new version and no stored events or external consumers rely on the old names. Nested classes sharing a simple name within one package collide; disambiguate them through the name or namespace attribute. See Nested message classes for the current naming rules.

Release 5.1.1

Features

  • #4581 Port EventStoreTransaction - allow overriding AppendCondition calculated from sourcing (#4291)

  • #4553 Add Snapshotting annotation support (#4306)

  • #4549 Introduce OpenRewrite script to help with migration from Axon Framework 4.x to Axon Framework 5.x (#3195)

Enhancements

  • #4604 Set expected axoniq.version to 5.1.1

  • #4599 Add OpenRewrite recipes to migrate SnapshotTriggerDefinition into @Snapshotting annotation (#3195)

  • #4598 Account for async snapshot storage in SnapshottingEntityLifecycleHandlerTestSuite

  • #4571 Align test naming with Maven defaults (#4425)

  • #4526 Fix fromFuture to return empty stream when future completes with null (#4516)

  • #4521 Fix fromFuture to return empty stream when future completes with null (#4516)

  • #4498 Make MessageStream improvements and add MessageStreamTestSuite

  • #4460 Rework snapshotting to allow single request snapshot and events streams

Bug fixes

  • #4610 Remove migration BOM tests failing due to chicken-and-egg problem

  • #4608 Copy AF4 dependencies during generate-test-resources

  • #4607 Combine all ListAppender-using snapshotting tests into a single @Nested class

  • #4606 Move AF4 dependencies inside profile for axon-migration module

  • #4603 Validate ProcessingContext is committed in SimpleQueryBus on emitUpdate, completeSubscriptions, and completeSubscriptionsExceptionally invocations (#4594)

  • #4587 Fix SplitTask leaving token store inconsistent after segment split (#4583)

  • #4578 Remove describe method from ComponentDescriptor interface

  • #4576 Fix migration paths documentation: update annotation from @InjectState to @InjectEntity in GiftCard example

  • #4567 Fix duplicate command handler registration when subtype overrides handler (#3934)

  • #4566 Fix Axon auto-configuration with graceful shutdown test (#3310)

  • #4565 Align test naming with Maven Surefire/Failsafe defaults (#4425)

  • #4537 Port TrackingToken per event in ProcessingContext from axon-5.1.x branch (#4510)

  • #4510 Fix PooledStreamingEventProcessor/WorkPackage - TrackingToken in ProcessingContext per event, not per batch (#4323)

  • #4388 Allow for commands without an entity to succeed (#4362)

Dependency upgrades

  • #4504 Update Axon Server image version

Contributors

We’d like to thank all the contributors who worked on this release!

Release 5.0

Release 5.0.3

Features

  • #4147 Introduce auto configuration for Dropwizard and Micrometer metrics

  • #4151 Remove @RoutingKey usages (#3804)

  • #4222 Allow TypeReference based component lookup (#4172)

Enhancements

  • #4141 Make Interceptor and Monitor construction Component aware

  • #4150 Remove Converter#canConvert methods (#3642)

  • #4159 Import axoniq/university-demo to examples

  • #4165 Align ProcessorDefinition naming with the EventProcessorModule

  • #4167 Add JDK25 build

  • #4173 Introduce local Command sequencing to avoid optimistic lock failures on concurrent command execution (#4155)

  • #4179 Refactor sequencing policies for general messaging usage

  • #4190 Update event publishing methods to accept lists of EventMessage subtypes

  • #4206 Provide JUnit extension for fixture lifecycle management (#4134)

  • #4212 Move JpaTransactionalExecutorProvider and JdbcTransactionalExecutorProvider to messaging module

  • #4219 Port axon-4.13.x into axon-5.0.x

  • #4231 Adjust ReplayToken context field type to byte[] (#4218)

  • #4238 EventAppender: add metadata aware append overloads

  • #4250 Introduce TransactionalExecutor for persistent Token Stores (#4248)

Documentation

  • #4131 Migration path documentation for messages (#4082)

  • #4132 Migration path documentation for Aggregates (#4083)

  • #4135 Monitoring section rewrite (#4094)

  • #4137 Refer to Migration Paths section from Migration Guide main page

  • #4148 Minor Getting Started improvements: Refer to examples and folder rename

  • #4156 Migration paths documentation for Projectors and Event Processors (#4084)

  • #4197 Introduce the Event Store migration path (#4096)

  • #4208 Test Fixture migration documentation (#4085)

  • #4216 Fix EntityCreator sample code (#4205)

  • #4227 Migration paths documentation for serializer/converter (#4091)

  • #4256 Adjust Spring Boot version support matrix

Bug fixes

  • #4149 Rename missing annotated to autodetected in configuration API

  • #4166 Ensure Event Handling Components are described correctly

  • #4168 Adjust build and SonarQube labels (#3875)

  • #4175 Ensure ResourceOverridingProcessingContext#resources() does not throw an UnsupportedOperationException

  • #4186 Fix integration test isolation for MonitoringPooledEventProcessingReportIT

  • #4187 Enabled Spring (Boot) tests and subsequent bug fixes (#3496)

  • #4192 WorkPackageTest: match TokenStore initialization contract

  • #4193 ResourceOverridingProcessingContext run lifecycle hooks with the overridden resources

  • #4217 Replay Handlers: Ensure only EventHandlingMembers are wrapped (#4214)

  • #4221 Add support for returning the resume position from a sourcing

  • #4228 Autoconfigure after should use names instead of classes in JpaEventStoreAutoConfiguration

  • #4229 Resolved some type reliance issues in handler wrappers

  • #4240 RecordingEventSink positioned before interceptors: interceptor message changes not reflected in recorded events (#4237)

  • #4255 Make routing with SequentialPolicy consistent across JVM restarts (#4253)

Contributors

We’d like to thank all the contributors who worked on this release!

Release 5.0.2

Features

  • [#4053] Introduce Event Processor Specification to influence Event Processor configuration when Event Handlers are autodetected

  • Added ability to customize event processor configuration in Spring by @abuijze in #4067]

Enhancements
  • [#4013] Add integration test using unit of work and EventStore with transactional resource

  • [#4014] Add new integration test using event store and unit of work

  • Annotated Message Handling Component alignment by @smcvb in #4041

  • Ensure every Message Handling Component can be described by @smcvb in #4047

  • Align EventHandlerRegistry with command and query equivalents by @smcvb in #4046

  • Align Annotated Message Handler subscription flow by @smcvb in #4042

  • Filter on EventHandlingMember in MethodSequencingPolicyEventHandlerDefinition by @smcvb in #4049

  • Introduce a TransactionalExecutor by @hjohn in #4055

  • [#4065] Remove processing context parameter from all EventStorageEngine methods except appendEvents

  • [#4065] Remove processing context from most EventStorageEngine methods by @hjohn in #4068

  • Add missing @Nonnull annotations in processing lifecycle by @hjohn in #4071

  • Minor Matchers and AxonTestFixture improvements by @smcvb in #4069

  • Rename parameter in EntityManagerExecutor by @hjohn in #4080

  • Adjustments to StorageEngineTestSuite for transactional executors by @hjohn in #4089

  • Event Processor Config: Remove MessageMonitor and SpanFactory customization by @smcvb in #4087

  • Add JDBC transactional executor + Spring integration by @hjohn in #4101

  • Remove the ProcessingLifecycleHandlerRegistrar by @smcvb in #4121

  • [#4032] [git] .gitignore ignores .idea/ but it contains committed files

  • [#4032] cleanup gitignore/idea/ setup by @jangalinski in #4035

  • [#3995] feat(test fixture): AxonTestThenCommand: resultMessagePayload convert payload before executing the check

  • [#3994] Remove ProcessingLifecycleHandlerRegistrar and its usages

Documentation

  • Migrate AF5 documentation from main to patch branch by @smcvb in #4102

  • [#4081] Introduce based Migration Paths section

  • [#4081] Introduce migration/paths sub section by @jangalinski in #4110

  • Adjust indent of Migration Paths section by @smcvb in #4124

Bug fixes

  • [#4010] Circular dependency error with Spring Boot 4.0 WebMVC and @EventHandler components

  • Fix Circular dependency error with Spring Boot 4.0 WebMVC and @EventHandler components by @jangalinski in #4020

  • [#4086] Align JPA storage engine to not enforce uniqueness of message identifier

  • Update identifier column to be non unique by @hjohn in #4122

  • [#4012] Resolve MessageType for query handlers based on MessageTypeResolver

  • [#4006] AggregateBasedJpaEventStorageEngine should return the max (or latest) token when tokenAt is called with a date in the future

  • [#4007] Feature/fix token at future date

  • [#3706] JDBC connections cannot be used by multiple threads at the same time

  • [#3704] In EventStorageEngine, JDBC/JPA implementations should not do work in AppendTransaction::commit

Contributors

We’d like to thank all the contributors who worked on this release!

Release 5.0.1

Enhancements

  • Update the AF 5.0.1 branch with AF 4.12.2 #3973

  • Feature/university example application #3969

  • List all autoconfigurations in Meta Inf, apply naming convention #3948

  • Show failed message handler in logs #3913

  • Adjust PSEP log levels #3896

  • Default to the AnnotationMessageTypeResolver in annotation specific components #3894

Bug fixes

  • Align UpdateChecker fixes from 4.12.2 with 5.0.1 #3985

  • [#3982] fix(test): Event events(@Nonnull` List<?>…​ events)`: invalid usage of varargs #3984

  • When splitting and merging tokens, update both tokens involved #3978

  • [#3938] Fix startup of application when axon server is not available #3966

  • ApplicationContext doesn’t start properly when AxonServer is not running #3938

  • Prevent duplicate registration of all handlers when using subtypes #3933

Contributors

We’d like to thank all the contributors who worked on this release!