Skip to content

Move Axon Server integration to Axoniq Framework#4412

Merged
smcvb merged 30 commits intoaxon-5.1.xfrom
enhancement/remove-axon-server-connector
Apr 17, 2026
Merged

Move Axon Server integration to Axoniq Framework#4412
smcvb merged 30 commits intoaxon-5.1.xfrom
enhancement/remove-axon-server-connector

Conversation

@smcvb
Copy link
Copy Markdown
Contributor

@smcvb smcvb commented Apr 14, 2026

This pull request removes the entire Axon Server integration from Axon Framework, as it's been moved to Axoniq Framework.
Concretely, this means the following is no longer present in this repository:

  1. The entire axon-server-connector Maven module
  2. Spring (Boot) specific Axon Server integrations
  3. Axon Server Testcontainers support
  4. Internal dependencies on axon-server-connector for examples and integration tests

This move is part of Axoniq's new open source and open core model, as described in this blog in more detail.
Specifically on the point of Axon Server, we expect people to have a subscription, as detailed here, when using Axon Server.
As clarified in the linked table, there's an "Individual", or developer plan, which is free of charge for those aiming to play around.

However, to conclude, given this choice for Axon Server, it's more transparent to maintain Axon Server framework details in another repository than this repository; hence the removal as per this PR.

Both Axon Framework (remaining open source) and Axoniq Framework (proprietary open core license) will see 5.1 release end of April, 2026.
For any questions around this pull request, feel free to reach out!

smcvb added 2 commits April 14, 2026 17:16
Remove axon-server-connector module entirely. This module is now part of Axoniq Framework instead of Axon Framework. This shift clarifies Axoniq's intent with Axon Server, as it's current license requires a subscription for single and multi-node setups.
Remove axon-server-connector dependency. Removal is inline with the removal of the module, in favor of the module's presence in the Axoniq Framework repository. This shift clarifies Axoniq's intent with Axon Server, as it's current license requires a subscription for single and multi-node setups.
@smcvb smcvb added this to the Release 5.1.0 milestone Apr 14, 2026
@smcvb smcvb self-assigned this Apr 14, 2026
@smcvb smcvb added Type: Enhancement Use to signal an issue enhances an already existing feature of the project. Priority 1: Must Highest priority. A release cannot be made if this issue isn’t resolved. labels Apr 14, 2026
@sonarqubecloud
Copy link
Copy Markdown

smcvb added 5 commits April 15, 2026 09:33
Remove testcontainer integration of Axon Server. Removal is inline with the removal of the logic, in favor of the new axoniq-testcontainer module in the Axoniq Framework repository. This shift clarifies Axoniq's intent with Axon Server, as it's current license requires a subscription for single and multi-node setups.
Remove Spring-specific integration of Axon Server. Removal is inline with the removal of the module, in favor of the module's presence in the Axoniq Framework repository. This shift clarifies Axoniq's intent with Axon Server, as it's current license requires a subscription for single and multi-node setups.
Remove Axon Server specific integration tests. Removal is inline with the removal of the module, in favor of the module's presence in the Axoniq Framework repository. This shift clarifies Axoniq's intent with Axon Server, as it's current license requires a subscription for single and multi-node setups.
Refer to class name i.o. class. This is safer and in line with the fact Axon and Axoniq Framework form a split between some previously integrated logic
Drop unused dependency
@vcanuel
Copy link
Copy Markdown

vcanuel commented Apr 15, 2026

Hi,
As a long-time Axon Framework user, I have to say this PR is quite surprising. The recent blog post gave the impression that the commercial Axoniq Framework would focus on new advanced capabilities (DCB, Workflows, Durable Execution) and some features migrating from 4.x (DLQ, Distributed Tracing). That was already a notable shift.
But extracting the Axon Server connector itself goes further than what was communicated. In practice, this means any company running Axon in a distributed setup will need a commercial license — not just for premium features, but for the basic bridge to Axon Server. The JPA-based storage engine remains available of course, but that only covers single-service, aggregate-based scenarios without distribution.
Are there other migrations of this kind planned for the near future?
On the bright side, we'll happily become paying customers — the pricing is fair and the framework is worth it. Just wanted to flag the surprise factor here. 😄

@smcvb
Copy link
Copy Markdown
Contributor Author

smcvb commented Apr 15, 2026

Hi, As a long-time Axon Framework user, I have to say this PR is quite surprising. The recent blog post gave the impression that the commercial Axoniq Framework would focus on new advanced capabilities (DCB, Workflows, Durable Execution) and some features migrating from 4.x (DLQ, Distributed Tracing). That was already a notable shift. But extracting the Axon Server connector itself goes further than what was communicated. In practice, this means any company running Axon in a distributed setup will need a commercial license — not just for premium features, but for the basic bridge to Axon Server. The JPA-based storage engine remains available of course, but that only covers single-service, aggregate-based scenarios without distribution. Are there other migrations of this kind planned for the near future? On the bright side, we'll happily become paying customers — the pricing is fair and the framework is worth it. Just wanted to flag the surprise factor here. 😄

Hey @vcanuel! There are definitely more things planned. You may have spotted the #4408 and #4410 PRs, to name a few.
The move of the Axon Server integration is part of our transparency here as well.
Axon Server, also single node, already requires some form of a subscription. This is inline with the license change per our previous conference.

Hence, we did not think it justified to maintain Axon Server integration inside an open source repository at all.

Given to the other things that will move: I am working on a table which will be part of the Documentation, linked to in the Readme, and propagated on our socials, that will explain what will and what will not move.

@smcvb smcvb added Type: Port Use to refer to an issue or pull request that ports logic from one branch to another. and removed Type: Enhancement Use to signal an issue enhances an already existing feature of the project. labels Apr 15, 2026
smcvb added 13 commits April 16, 2026 14:01
Remove AxonServer specific integration tests again. With #4413 implemented, the test suites can be implemented differently depending on the available infrastructure. As we're moving Axon Server entirely to Axoniq Framework, any Axon Server versions of the integration tests should be ported entirely.
Port Axon Server with Spring Boot testcontainer specific tests. As Axon Server is now part of Axoniq Framework, those tests reside there.
Port Axon Server test in combination with JPA. As Axon Server is now part of Axoniq Framework, those tests reside there.
Drop AxonServerConfigurationEnhancer disablement. These tests will no longer automatically encounter Axon Server's configuration enhancer, so there's no need to keep the disablement for speed up
Port all Axon Server specific Persistent Stream integration. As Axon Server logic moves to Axoniq Framework, the Persistent Stream integration will move as well.
Remove remaining imports on Axon Server autoconfiguration. As Axon Server logic moves to Axoniq Framework, there's no means the tests can accidentally integrate with it anymore.
Drop use of axon.axonserver.enabled property. As Axon Server logic moves to Axoniq Framework, there's no need to disable it anymore.
Drop redundant Axon Server Connector dependency. As Axon Server logic moves to Axoniq Framework, there's no need for this version anymore.
Remove redundant suppression. As Axon Server logic moves to Axoniq Framework, there's no need for this version anymore.
Remove leftover axon-server-connector dependency
…dependency

Remove leftover Axon Server IT usage after removal of last remaining dependency
Remove more leftover Axon Server autoconfig imports. Not sure why these popped up later, but there you go
smcvb added 3 commits April 16, 2026 15:29
Remove Axon Server autoconfig from AutoConfiguration.imports
Remove spring.factories file. This file only contains Axon Server specific Testcontainer support, which, as it's been moved to Axoniq Framework, doesn't belong here.
Add dependency (I assume) previously pulled in by axonServer. Without it, the db-scheduler tests throw a ClassNotFoundException
@smcvb smcvb marked this pull request as ready for review April 16, 2026 14:05
@smcvb smcvb requested review from MateuszNaKodach, abuijze, hatzlj, hjohn, jangalinski and zambrovski and removed request for hjohn, jangalinski and zambrovski April 16, 2026 14:05
smcvb added 3 commits April 16, 2026 16:29
Add 5.1.0-RC2 dependency on connector and tests. We need Axoniq Framework to be released for the examples to work properly. To unblock for now, it's easier to depend on the latest, being 5.1.0-RC2, which still contains the AxonServerContainer and AxonServerContainerTestUtils required by the examples
Switch to new Sonar settings. With Axon Framework moved to the AxonIQ GitHub organization, we need to adjust the project key and organization reference
Set AxonServer-detail containing modules to 5.1.0-RC2. This allows us to not adjust the examples just yet.
@MateuszNaKodach
Copy link
Copy Markdown
Contributor

MateuszNaKodach commented Apr 16, 2026

Problem

The build is failing because:

io.grpc.StatusRuntimeException: UNAVAILABLE: Network closed for unknown reason
	at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:368) ~[grpc-stub-1.79.0.jar:1.79.0]
	at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:349) ~[grpc-stub-1.79.0.jar:1.79.0]
	at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:174) ~[grpc-stub-1.79.0.jar:1.79.0]
	at io.axoniq.axonserver.grpc.control.PlatformServiceGrpc$PlatformServiceBlockingStub.getPlatformServer(PlatformServiceGrpc.java:308) ~[axonserver-connector-java-2026.0.0.jar:2026.0.0]
	at io.axoniq.axonserver.connector.impl.AxonServerManagedChannel.connectChannel(AxonServerManagedChannel.java:122) ~[axonserver-connector-java-2026.0.0.jar:2026.0.0]
	at io.axoniq.axonserver.connector.impl.AxonServerManagedChannel.createConnection(AxonServerManagedChannel.java:343) ~[axonserver-connector-java-2026.0.0.jar:2026.0.0]
	at io.axoniq.axonserver.connector.impl.AxonServerManagedChannel.ensureConnected(AxonServerManagedChannel.java:308) ~[axonserver-connector-java-2026.0.0.jar:2026.0.0]
	at io.axoniq.axonserver.connector.impl.AxonServerManagedChannel.lambda$scheduleConnectionCheck$4(AxonServerManagedChannel.java:386) ~[axonserver-connector-java-2026.0.0.jar:2026.0.0]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:309) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1474) ~[na:na]

I have this locally as well... and I'm not sure what is the problem.

Cause

Diagnose what's happening (thanks Claude):

The problem has two layers:

1. Maven reactor precedence overrides the intended version

The dependency tree showed the critical issue:

axon-spring-boot-starter:5.1.0-RC2
  └── axon-spring-boot-autoconfigure:5.1.0-SNAPSHOT  ← LOCAL BUILD wins!

The examples explicitly use axon-spring-boot-starter:5.1.0-RC2 (fixed version from Maven Central), but since the multi-module build includes spring-boot-autoconfigure in the reactor at 5.1.0-SNAPSHOT, Maven gives the local artifact precedence over the RC2 transitive dependency.

2. The local SNAPSHOT removed two things that the examples need

The local spring-boot-autoconfigure:5.1.0-SNAPSHOT (from this branch) has had removed:

  • AxonServerAutoConfiguration from AutoConfiguration.imports (commit 215a354b35) — the class that configured the Axon Server connection using Spring Environment, respecting axon.axonserver.enabled and axon.axonserver.servers
  • spring.factories (commit 5ef9599338) — which registered AxonServerDockerComposeConnectionDetailsFactory and AxonServerTestContainerConnectionDetailsFactory

3. But AxonServerConfigurationEnhancer still runs via ServiceLoader

The axon-server-connector:5.1.0-RC2 jar (which IS on the examples' classpath) registers AxonServerConfigurationEnhancer via META-INF/services/org.axonframework.common.configuration.ConfigurationEnhancer. This is pure Java SPI — Spring Boot doesn't control it. So the enhancer still activates and tries to connect to Axon Server.

Without AxonServerAutoConfiguration wiring the Spring Environment into the connection setup, @DynamicPropertySource settings from UniversityTestApplicationITest don't reach the enhancer properly, causing it to fall back to defaults and fail.

In short: This branch's local SNAPSHOT removes the Spring glue between the Axon Server connector (which self-registers via ServiceLoader and still runs) and the Spring test context (which would have provided the TestContainer address). The result is a connection attempt to a server that was never properly configured.

MateuszNaKodach and others added 2 commits April 17, 2026 01:37
The Spring Boot university examples are designed to run against the
published 5.1.0-RC2 release, which still includes Axon Server support.
However, when built via `-Pexamples` as part of the main reactor, Maven
was resolving all Axon framework artifacts (core modules and Spring
extensions) to the local 5.1.0-SNAPSHOT build instead of the intended
RC2 releases.

On this branch the local SNAPSHOT has AxonServerAutoConfiguration
removed from the autoconfigure module and the spring.factories
ConnectionDetailsFactories stripped out. The axon-server-connector:RC2
jar still self-registers AxonServerConfigurationEnhancer via
ServiceLoader, so tests attempted an Axon Server connection — but
without the Spring glue that used to wire the test context (Testcontainer
address, axon.axonserver.enabled guard) into that connection, every test
context startup failed with "no connection to AxonServer".

Root cause: examples/pom.xml imported axon-framework-bom at
${project.version} (SNAPSHOT). This BOM covers all core and Spring
extension modules, so the managed versions all resolved to SNAPSHOT,
which the reactor then supplied from the local build.

Fix: import axon-framework-bom at 5.1.0-RC2. Maven now requests the
release coordinates (5.1.0-RC2) for every managed Axon artifact; the
reactor only has 5.1.0-SNAPSHOT, so it is not a match and Maven fetches
the published RC2 artifacts from Maven Central. Both local and CI builds
are affected equally, requiring no additional CI configuration changes.
Disable examples GHA. The examples are brittle at the moment, as they need to depend on the axon-server-connector module, which has not yet seen a release in Axoniq Framework. Added a todo referring to an issue number to tackle this on the first (RC) release of Axoniq Framework.
@sonarqubecloud
Copy link
Copy Markdown

@smcvb smcvb merged commit 16056a3 into axon-5.1.x Apr 17, 2026
6 checks passed
@smcvb smcvb deleted the enhancement/remove-axon-server-connector branch April 17, 2026 11:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Priority 1: Must Highest priority. A release cannot be made if this issue isn’t resolved. Type: Port Use to refer to an issue or pull request that ports logic from one branch to another.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants