From 4d37449df1bf283221eec9a77eef204ebf857c7f Mon Sep 17 00:00:00 2001 From: JohT Date: Wed, 1 Dec 2021 20:08:22 +0100 Subject: [PATCH 1/4] Unified native image integration tests --- ...onfigTest.java => NatieImageReflectionConfigTest.java} | 6 +++--- .../service/account/AccountRessourceNativeImageIT.java | 8 ++++++++ .../NativeNicknamesProjectionManagementResourceIT.java | 8 -------- .../NicknameEventStreamResourceNativeImageIT.java | 8 ++++++++ ...cknamesProjectionManagementResourceNativeImageIT.java} | 3 +-- 5 files changed, 20 insertions(+), 13 deletions(-) rename showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/{NatieImageReflectConfigTest.java => NatieImageReflectionConfigTest.java} (95%) create mode 100644 showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/account/AccountRessourceNativeImageIT.java delete mode 100644 showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknamesProjectionManagementResourceIT.java create mode 100644 showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknameEventStreamResourceNativeImageIT.java rename showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/{NativeNicknameEventStreamResourceIT.java => NicknamesProjectionManagementResourceNativeImageIT.java} (61%) diff --git a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectConfigTest.java b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectionConfigTest.java similarity index 95% rename from showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectConfigTest.java rename to showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectionConfigTest.java index 99860e4..b9414b0 100644 --- a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectConfigTest.java +++ b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/nativeimage/NatieImageReflectionConfigTest.java @@ -32,7 +32,7 @@ * * @author JohT */ -class NatieImageReflectConfigTest { +class NatieImageReflectionConfigTest { private static final Jsonb create = JsonbBuilder.create(); @Test @@ -45,7 +45,7 @@ void missingInManualEditedFile() { // .filter(name -> // !classForName(name).map(Class::isInterface).orElse(Boolean.FALSE)) .collect(Collectors.joining("\n")); - System.out.println("missingInManualEditedFile"); + System.out.println("\nmissingInManualEditedFile:\n"); System.out.println(axonClasses); } @@ -54,7 +54,7 @@ void missingInGeneratedFile() { Set mainConfig = classNamesRegisteredForReflections("reflection-config.json"); Set generatedConfig = classNamesRegisteredForReflections("native-image/432-reflect-config.json"); mainConfig.removeAll(generatedConfig); - System.out.println("missingInGeneratedFile"); + System.out.println("\nmissingInGeneratedFile:\n"); System.out.println(mainConfig.stream().collect(Collectors.joining("\n"))); } diff --git a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/account/AccountRessourceNativeImageIT.java b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/account/AccountRessourceNativeImageIT.java new file mode 100644 index 0000000..e4f2490 --- /dev/null +++ b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/account/AccountRessourceNativeImageIT.java @@ -0,0 +1,8 @@ +package io.github.joht.showcase.quarkuseventsourcing.service.account; + +import io.quarkus.test.junit.NativeImageTest; + +@NativeImageTest +public class AccountRessourceNativeImageIT extends AccountResourceTest { + // Execute the same tests but in native mode. +} diff --git a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknamesProjectionManagementResourceIT.java b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknamesProjectionManagementResourceIT.java deleted file mode 100644 index e3639ac..0000000 --- a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknamesProjectionManagementResourceIT.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.joht.showcase.quarkuseventsourcing.service.nickname; - -import io.quarkus.test.junit.NativeImageTest; - -@NativeImageTest -public class NativeNicknamesProjectionManagementResourceIT extends NicknamesProjectionManagementResourceTest { - // run the same tests -} diff --git a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknameEventStreamResourceNativeImageIT.java b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknameEventStreamResourceNativeImageIT.java new file mode 100644 index 0000000..5ecf041 --- /dev/null +++ b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknameEventStreamResourceNativeImageIT.java @@ -0,0 +1,8 @@ +package io.github.joht.showcase.quarkuseventsourcing.service.nickname; + +import io.quarkus.test.junit.NativeImageTest; + +@NativeImageTest +public class NicknameEventStreamResourceNativeImageIT extends NicknameEventStreamResourceTest { + // Execute the same tests but in native mode. +} diff --git a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknameEventStreamResourceIT.java b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknamesProjectionManagementResourceNativeImageIT.java similarity index 61% rename from showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknameEventStreamResourceIT.java rename to showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknamesProjectionManagementResourceNativeImageIT.java index ed8be01..fccc7ce 100644 --- a/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NativeNicknameEventStreamResourceIT.java +++ b/showcase-quarkus-eventsourcing/src/test/java/io/github/joht/showcase/quarkuseventsourcing/service/nickname/NicknamesProjectionManagementResourceNativeImageIT.java @@ -3,7 +3,6 @@ import io.quarkus.test.junit.NativeImageTest; @NativeImageTest -public class NativeNicknameEventStreamResourceIT extends NicknameEventStreamResourceTest { - +public class NicknamesProjectionManagementResourceNativeImageIT extends NicknamesProjectionManagementResourceTest { // Execute the same tests but in native mode. } From 6bec4d1440aa5d48fe9d48af9d05bc178c796458 Mon Sep 17 00:00:00 2001 From: JohT Date: Wed, 1 Dec 2021 20:09:37 +0100 Subject: [PATCH 2/4] Continuous Integration for native image build and tests --- .github/workflows/native-image.yml | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/native-image.yml diff --git a/.github/workflows/native-image.yml b/.github/workflows/native-image.yml new file mode 100644 index 0000000..b799971 --- /dev/null +++ b/.github/workflows/native-image.yml @@ -0,0 +1,33 @@ +name: GraalVM Community Edition Continuous Integration + +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + java: ['java11'] + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2.1.6 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + - name: Setup GraalVM Community Edition + uses: DeLaGuardo/setup-graalvm@5.0 + with: + graalvm: 21.3.0 + java: ${{ matrix.java }} + - name: Install Native Image + run: gu install native-image + - name: Build native image with Maven + working-directory: showcase-quarkus-eventsourcing + run: mvn verify --activate-profiles native --file pom.xml --batch-mode \ No newline at end of file From fdcc8cef26fdb8165c6e2b63403d5081313bcb27 Mon Sep 17 00:00:00 2001 From: JohT Date: Wed, 1 Dec 2021 20:11:28 +0100 Subject: [PATCH 3/4] Update to AxonFramework v4.5.5 --- showcase-quarkus-eventsourcing/README.md | 8 ++++---- showcase-quarkus-eventsourcing/pom.xml | 4 ++-- .../messaging/query/boundary/QueryModelResetHandler.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/showcase-quarkus-eventsourcing/README.md b/showcase-quarkus-eventsourcing/README.md index 12600f1..2d1f51a 100644 --- a/showcase-quarkus-eventsourcing/README.md +++ b/showcase-quarkus-eventsourcing/README.md @@ -17,7 +17,7 @@ Details see [Building a native executable](https://quarkus.io/guides/building-native-image-guide) * The substrate runner can be used to collect configuration data for the native image: ``` -$GRAALVM_HOME/bin/java -agentlib:native-image-agent=config-output-dir=native-image,caller-filter-file=native-image-caller-filter-rules.json -jar ./target/showcase-quarkus-eventsourcing-1.0-SNAPSHOT-runner.jar +$GRAALVM_HOME/bin/java -agentlib:native-image-agent=config-output-dir=native-image,caller-filter-file=native-image-caller-filter-rules.json -jar ./target/showcase-quarkus-eventsourcing-1.3-SNAPSHOT-runner.jar ``` This is helpful to get a hint on how to configure ```reflection-config.json``` and ```resources-config.json``` These files were configured that way. @@ -25,13 +25,13 @@ $GRAALVM_HOME/bin/java -agentlib:native-image-agent=config-output-dir=native-ima Ideally, there would be a axon-extension for quarkus that manages these settings. * The substrate runner can also be used to generate a trace of all reflection calls: ``` -$GRAALVM_HOME/bin/java -agentlib:native-image-agent=trace-output=native-image/trace-output.json,caller-filter-file=native-image-caller-filter-rules.json -jar ./target/showcase-quarkus-eventsourcing-1.0-SNAPSHOT-runner.jar +$GRAALVM_HOME/bin/java -agentlib:native-image-agent=trace-output=native-image/trace-output.json,caller-filter-file=native-image-caller-filter-rules.json -jar ./target/showcase-quarkus-eventsourcing-1.3-SNAPSHOT-runner.jar ``` * More informations abount the `native-image-agent` can be found here: [CONFIGURE.md](https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md) ## Features -* "Reactive" example using server sent events (tested with safari browser) and axon subscription query +* "Reactive" example using server sent events (tested with safari & chrome browser) and axon subscription query * Replay example. Use REST DELETE ```/nicknames/projection``` * Contains an axon upcaster example * Works with H2 and PostgreSql. Just switch the regarding comments in ```application.properties``` and ```persistence.xml```. @@ -42,7 +42,7 @@ $GRAALVM_HOME/bin/java -agentlib:native-image-agent=trace-output=native-image/tr ## Notes * Code comments containing the marker ```Note:``` describes thoughts, background information, documented decisions and hints to problems. -* ```ArchitectureRulesTest``` defines rules to assure low coupling between the business core, axon and the microprofile features. +* ```ArchitectureRulesTest``` defines rules to assure low coupling between the business core, axon and microprofile features. * These rules might seem a bit extreme. Some may even find them to be impractical. After all, this examples shows that it can be done. * This is just a simple show case, not an full application. diff --git a/showcase-quarkus-eventsourcing/pom.xml b/showcase-quarkus-eventsourcing/pom.xml index fd7a41f..3dab750 100644 --- a/showcase-quarkus-eventsourcing/pom.xml +++ b/showcase-quarkus-eventsourcing/pom.xml @@ -5,7 +5,7 @@ io.github.joht.showcase.quarkuseventsourcing showcase-quarkus-eventsourcing - 1.2-SNAPSHOT + 1.3-SNAPSHOT 3.8.1 @@ -22,7 +22,7 @@ 2.5.0.Final 2.5.0.Final - 4.3.2 + 4.5.5 1.6.1 1.2.10 diff --git a/showcase-quarkus-eventsourcing/src/main/java/io/github/joht/showcase/quarkuseventsourcing/messaging/query/boundary/QueryModelResetHandler.java b/showcase-quarkus-eventsourcing/src/main/java/io/github/joht/showcase/quarkuseventsourcing/messaging/query/boundary/QueryModelResetHandler.java index 4aeb3df..aa52c2d 100644 --- a/showcase-quarkus-eventsourcing/src/main/java/io/github/joht/showcase/quarkuseventsourcing/messaging/query/boundary/QueryModelResetHandler.java +++ b/showcase-quarkus-eventsourcing/src/main/java/io/github/joht/showcase/quarkuseventsourcing/messaging/query/boundary/QueryModelResetHandler.java @@ -6,8 +6,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.axonframework.eventhandling.EventHandler; -import org.axonframework.eventhandling.ResetTriggeredEvent; +import org.axonframework.eventhandling.replay.ResetContext; +import org.axonframework.messaging.annotation.MessageHandler; /** * Used to mark a method inside a event handler ("projection") to be called, @@ -16,7 +16,7 @@ @Documented @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) -@EventHandler(payloadType = ResetTriggeredEvent.class) +@MessageHandler(messageType = ResetContext.class) public @interface QueryModelResetHandler { } From 0c6d3ef88cd8335c000a74fcf7d3d0170c34c71d Mon Sep 17 00:00:00 2001 From: JohT Date: Wed, 1 Dec 2021 20:19:05 +0100 Subject: [PATCH 4/4] Removed unnecessary reflection configuration entries --- .../reflection-config.json | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/showcase-quarkus-eventsourcing/reflection-config.json b/showcase-quarkus-eventsourcing/reflection-config.json index 6ad6ac4..d013f43 100644 --- a/showcase-quarkus-eventsourcing/reflection-config.json +++ b/showcase-quarkus-eventsourcing/reflection-config.json @@ -219,45 +219,36 @@ }, { "name": "org.axonframework.eventhandling.GapAwareTrackingToken", - "allDeclaredFields": true, "allDeclaredMethods": true, "allDeclaredConstructors": true }, { "name": "org.axonframework.eventhandling.ReplayToken", - "allDeclaredFields": true, "allDeclaredMethods": true, "allDeclaredConstructors": true }, { "name": "org.axonframework.eventhandling.TrackingToken", - "allDeclaredConstructors": true, "allDeclaredMethods": true, "allDeclaredFields": true }, { "name": "org.axonframework.eventhandling.WrappedToken", - "allDeclaredConstructors": true, "allDeclaredMethods": true, "allDeclaredFields": true }, { "name": "org.axonframework.eventhandling.Timestamp", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.messaging.MetaData", "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.serialization.upcasting.event.EventUpcaster", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.serialization.upcasting.SingleEntryUpcaster", @@ -267,27 +258,20 @@ }, { "name": "org.axonframework.serialization.upcasting.Upcaster", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.serialization.upcasting.event.EventUpcaster", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.serialization.upcasting.event.IntermediateEventRepresentation", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.serialization.upcasting.event.SingleEventUpcaster", "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true + "allDeclaredMethods": true }, { "name": "org.axonframework.modelling.command.AggregateIdentifier",