diff --git a/.github/workflows/build-main-branches.yml b/.github/workflows/build-main-branches.yml index 3c30440bf..2a07e34a6 100644 --- a/.github/workflows/build-main-branches.yml +++ b/.github/workflows/build-main-branches.yml @@ -12,40 +12,172 @@ on: jobs: build: runs-on: ubuntu-latest - continue-on-error: ${{ matrix.java.continue-on-error == true }} strategy: matrix: - java: [ - { - 'name': '', - 'version': '17', - }, - { - 'name': '', - 'version': '21', - }, - { - 'name': '', - 'version': '25', - }, - { - 'version': '21', - 'build_opts': '-Pslow-flaky-tests -Drevapi.skip=true -Dformat.skip=true', - 'name': 'Slow and Flaky tests', - 'continue-on-error': true - } - ] - name: Build with Java ${{ matrix.java.version }} ${{ matrix.java.name }} + java: + - '17' + - '21' + - '25' + name: Build (Java ${{ matrix.java }}) steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: ${{ matrix.java.version }} + java-version: ${{ matrix.java }} distribution: temurin cache: maven - name: Build with Maven - env: - MAVEN_OPTS: ${{ matrix.java.opts }} run: | - mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon -B \ - clean install -Dtest-containers=true ${{ matrix.java.build_opts }} + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B clean install -DskipTests -T1C + - name: Upload Maven Repository + uses: actions/upload-artifact@v7 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + retention-days: 1 + + core-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: + - '17' + - '21' + - '25' + name: Core Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run Core Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :smallrye-reactive-messaging-api,:smallrye-reactive-messaging-provider,:smallrye-reactive-messaging-otel,:smallrye-reactive-messaging-health,:smallrye-reactive-messaging-jackson,:smallrye-reactive-messaging-jsonb,:test-common,:smallrye-connector-attribute-processor,:smallrye-reactive-messaging-kafka-api,:smallrye-reactive-messaging-kafka-test-companion + + kafka-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: + - '17' + - '21' + - '25' + name: Kafka Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run Kafka Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :smallrye-reactive-messaging-kafka + + connector-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + connector: + - name: AMQP + artifact: smallrye-reactive-messaging-amqp + - name: MQTT + artifact: smallrye-reactive-messaging-mqtt + - name: RabbitMQ + artifact: smallrye-reactive-messaging-rabbitmq + - name: Pulsar + artifact: smallrye-reactive-messaging-pulsar + - name: GCP Pub/Sub + artifact: smallrye-reactive-messaging-gcp-pubsub + - name: AWS SNS + artifact: smallrye-reactive-messaging-aws-sns + - name: AWS SQS + artifact: smallrye-reactive-messaging-aws-sqs + - name: Camel + artifact: smallrye-reactive-messaging-camel + - name: JMS + artifact: smallrye-reactive-messaging-jms + - name: In-Memory + artifact: smallrye-reactive-messaging-in-memory + java: + - '17' + - '21' + - '25' + name: ${{ matrix.connector.name }} Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run ${{ matrix.connector.name }} Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :${{ matrix.connector.artifact }} + + slow-flaky-tests: + needs: build + runs-on: ubuntu-latest + continue-on-error: true + strategy: + fail-fast: false + matrix: + connector: + - name: Kafka + artifact: smallrye-reactive-messaging-kafka + - name: Pulsar + artifact: smallrye-reactive-messaging-pulsar + - name: Kafka Test Companion + artifact: smallrye-reactive-messaging-kafka-test-companion + name: ${{ matrix.connector.name }} Slow/Flaky Tests + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-21 + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run ${{ matrix.connector.name }} Slow/Flaky Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Pslow-flaky-tests -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :${{ matrix.connector.artifact }} diff --git a/.github/workflows/build-pull.yml b/.github/workflows/build-pull.yml index b8f3e41f4..07ec6eb40 100644 --- a/.github/workflows/build-pull.yml +++ b/.github/workflows/build-pull.yml @@ -11,43 +11,182 @@ on: jobs: build: runs-on: ubuntu-latest - continue-on-error: ${{ matrix.java.continue-on-error == true }} strategy: matrix: - java: [ - { - 'name': '', - 'version': '17', - }, - { - 'name': '', - 'version': '21', - }, - { - 'name': '', - 'version': '25', - }, - { - 'version': '21', - 'build_opts': '-Pslow-flaky-tests -Drevapi.skip=true -Dformat.skip=true', - 'name': 'Slow and Flaky tests', - 'continue-on-error': true - } - ] - name: Build with Java ${{ matrix.java.version }} ${{ matrix.java.name }} + java: + - '17' + - '21' + - '25' + name: Build (Java ${{ matrix.java }}) steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: ${{ matrix.java.version }} + java-version: ${{ matrix.java }} distribution: temurin cache: maven - name: Build with Maven - env: - MAVEN_OPTS: ${{ matrix.java.opts }} run: | mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ - -B clean install -Pcoverage -Dtest-containers=true ${{ matrix.java.build_opts }} - - name: Codecov - uses: codecov/codecov-action@v6.0.0 - if: false + -B clean install -DskipTests -T1C + - name: Upload Maven Repository + uses: actions/upload-artifact@v7 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + retention-days: 1 + + core-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: + - '17' + - '21' + - '25' + name: Core Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run Core Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :smallrye-reactive-messaging-api,:smallrye-reactive-messaging-provider,:smallrye-reactive-messaging-otel,:smallrye-reactive-messaging-health,:smallrye-reactive-messaging-jackson,:smallrye-reactive-messaging-jsonb,:test-common,:smallrye-connector-attribute-processor,:smallrye-reactive-messaging-kafka-api,:smallrye-reactive-messaging-kafka-test-companion + + kafka-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: + - '17' + - '21' + - '25' + name: Kafka Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run Kafka Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :smallrye-reactive-messaging-kafka + + connector-tests: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + connector: + - name: AMQP + artifact: smallrye-reactive-messaging-amqp + - name: MQTT + artifact: smallrye-reactive-messaging-mqtt + - name: RabbitMQ + artifact: smallrye-reactive-messaging-rabbitmq + - name: Pulsar + artifact: smallrye-reactive-messaging-pulsar + - name: GCP Pub/Sub + artifact: smallrye-reactive-messaging-gcp-pubsub + - name: AWS SNS + artifact: smallrye-reactive-messaging-aws-sns + - name: AWS SQS + artifact: smallrye-reactive-messaging-aws-sqs + - name: Camel + artifact: smallrye-reactive-messaging-camel + - name: JMS + artifact: smallrye-reactive-messaging-jms + - name: In-Memory + artifact: smallrye-reactive-messaging-in-memory + java: + - '17' + - '21' + - '25' + name: ${{ matrix.connector.name }} Tests (Java ${{ matrix.java }}) + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-${{ matrix.java }} + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run ${{ matrix.connector.name }} Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :${{ matrix.connector.artifact }} + + ci-status: + if: always() + needs: [build, core-tests, kafka-tests, connector-tests] + runs-on: ubuntu-latest + name: CI Status + steps: + - name: Check CI status + if: ${{ needs.build.result != 'success' || needs.core-tests.result != 'success' || needs.kafka-tests.result != 'success' || needs.connector-tests.result != 'success' }} + run: exit 1 + + slow-flaky-tests: + needs: build + runs-on: ubuntu-latest + continue-on-error: true + strategy: + fail-fast: false + matrix: + connector: + - name: Kafka + artifact: smallrye-reactive-messaging-kafka + - name: Pulsar + artifact: smallrye-reactive-messaging-pulsar + - name: Kafka Test Companion + artifact: smallrye-reactive-messaging-kafka-test-companion + name: ${{ matrix.connector.name }} Slow/Flaky Tests + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: temurin + cache: maven + - name: Download Maven Repository + uses: actions/download-artifact@v8 + with: + name: maven-repo-java-21 + path: ~/.m2/repository/io/smallrye/reactive/ + - name: Run ${{ matrix.connector.name }} Slow/Flaky Tests + run: | + mvn -s .build/ci-maven-settings.xml -Dmaven.resolver.transport=wagon \ + -B verify -Pslow-flaky-tests -Dtest-containers=true \ + -Drevapi.skip=true -Dformat.skip=true \ + -pl :${{ matrix.connector.artifact }} diff --git a/smallrye-reactive-messaging-kafka-test-companion/revapi.json b/smallrye-reactive-messaging-kafka-test-companion/revapi.json index 38e24d82d..fbd24302c 100644 --- a/smallrye-reactive-messaging-kafka-test-companion/revapi.json +++ b/smallrye-reactive-messaging-kafka-test-companion/revapi.json @@ -24,7 +24,14 @@ "criticality" : "highlight", "minSeverity" : "POTENTIALLY_BREAKING", "minCriticality" : "documented", - "differences" : [ ] + "differences" : [ + { + "code": "java.field.constantValueChanged", + "old": "field io.smallrye.reactive.messaging.kafka.companion.test.KafkaBrokerExtension.KAFKA_IMAGE", + "new": "field io.smallrye.reactive.messaging.kafka.companion.test.KafkaBrokerExtension.KAFKA_IMAGE", + "justification": "Run tests on kafka-native image" + } + ] } }, { "extension" : "revapi.reporter.json", @@ -43,4 +50,4 @@ "minCriticality" : "documented", "output" : "out" } -} ] \ No newline at end of file +} ] diff --git a/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaBrokerExtension.java b/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaBrokerExtension.java index c9309f4ab..d5047110d 100644 --- a/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaBrokerExtension.java +++ b/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaBrokerExtension.java @@ -32,7 +32,7 @@ public class KafkaBrokerExtension implements BeforeAllCallback, BeforeEachCallback, ParameterResolver, CloseableResource { public static final Logger LOGGER = Logger.getLogger(KafkaBrokerExtension.class.getName()); - public static final String KAFKA_IMAGE = "apache/kafka"; + public static final String KAFKA_IMAGE = "apache/kafka-native"; public static final String STRIMZI_IMAGE = "quay.io/strimzi-test-container/test-container"; public static final String KAFKA_VERSION = "4.2.0"; public static final String STRIMZI_VERSION = "4.2.0"; diff --git a/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaContainer.java b/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaContainer.java index cf0b9f2b6..188f6b7e9 100644 --- a/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaContainer.java +++ b/smallrye-reactive-messaging-kafka-test-companion/src/main/java/io/smallrye/reactive/messaging/kafka/companion/test/KafkaContainer.java @@ -40,7 +40,7 @@ public class KafkaContainer extends GenericContainer { static final String[] COMMAND = { "sh", "-c", - "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT, + "while [ ! -x " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT, }; static final WaitStrategy WAIT_STRATEGY = Wait.forLogMessage(".*Transitioning from RECOVERY to RUNNING.*", 1); @@ -157,10 +157,54 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { // exporting KAFKA_ADVERTISED_LISTENERS with the container hostname command += String.format("export KAFKA_ADVERTISED_LISTENERS=%s\n", kafkaAdvertisedListeners); - command += "/etc/kafka/docker/run \n"; + command += nativeLaunchScript(); copyFileToContainer(Transferable.of(command, 0777), STARTER_SCRIPT); } + /** + * Generates a shell snippet that detects whether the container runs a native image + * and, if so, launches Kafka directly with {@code -Duser.name} / {@code -Duser.home} flags + * to work around a gcompat {@code getpwuid} segfault on Alpine (KAFKA-20314). + * For JVM images the original {@code /etc/kafka/docker/run} entrypoint is used as-is. + */ + static String nativeLaunchScript() { + String userOpts = "-Duser.name=appuser -Duser.home=/home/appuser"; + return "if [ -f /opt/kafka/kafka.Kafka ]; then\n" + + // source config scripts (normally done by /etc/kafka/docker/run) + " . /etc/kafka/docker/bash-config\n" + + " . /etc/kafka/docker/configureDefaults\n" + + " . /etc/kafka/docker/configure\n" + + // JMX setup (mirrors /etc/kafka/docker/launch) + " if [ -z \"${KAFKA_JMX_OPTS-}\" ]; then\n" + + " export KAFKA_JMX_OPTS=\"-Dcom.sun.management.jmxremote=true" + + " -Dcom.sun.management.jmxremote.authenticate=false" + + " -Dcom.sun.management.jmxremote.ssl=false\"\n" + + " fi\n" + + " export KAFKA_JMX_HOSTNAME=${KAFKA_JMX_HOSTNAME:-$(hostname -i | cut -d' ' -f1)}\n" + + " if [ \"${KAFKA_JMX_PORT-}\" ]; then\n" + + " export JMX_PORT=$KAFKA_JMX_PORT\n" + + " export KAFKA_JMX_OPTS=\"$KAFKA_JMX_OPTS" + + " -Djava.rmi.server.hostname=$KAFKA_JMX_HOSTNAME" + + " -Dcom.sun.management.jmxremote.local.only=false" + + " -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" + + " -Dcom.sun.management.jmxremote.port=$JMX_PORT\"\n" + + " fi\n" + + // setup + " /opt/kafka/kafka.Kafka " + userOpts + " setup" + + " --default-configs-dir /etc/kafka/docker" + + " --mounted-configs-dir /mnt/shared/config" + + " --final-configs-dir /opt/kafka/config 2>&1 || true\n" + + // start + " KAFKA_LOG4J_CMD_OPTS=\"-Dkafka.logs.dir=/opt/kafka/logs/" + + " -Dlog4j2.configurationFile=file:/opt/kafka/config/log4j2.yaml\"\n" + + " exec /opt/kafka/kafka.Kafka " + userOpts + " start" + + " --config /opt/kafka/config/server.properties" + + " $KAFKA_LOG4J_CMD_OPTS $KAFKA_JMX_OPTS ${KAFKA_OPTS-}\n" + + "else\n" + + " exec /etc/kafka/docker/run\n" + + "fi\n"; + } + public KafkaContainer withPort(int fixedPort) { if (fixedPort <= 0) { throw new IllegalArgumentException("The fixed Kafka port must be greater than 0"); diff --git a/smallrye-reactive-messaging-kafka/pom.xml b/smallrye-reactive-messaging-kafka/pom.xml index 8571a325e..2c3d87c96 100644 --- a/smallrye-reactive-messaging-kafka/pom.xml +++ b/smallrye-reactive-messaging-kafka/pom.xml @@ -176,6 +176,7 @@ none:none + 3 true slf4j diff --git a/smallrye-reactive-messaging-kafka/revapi.json b/smallrye-reactive-messaging-kafka/revapi.json index 87c958012..72ad02e8c 100644 --- a/smallrye-reactive-messaging-kafka/revapi.json +++ b/smallrye-reactive-messaging-kafka/revapi.json @@ -55,4 +55,4 @@ "minCriticality" : "documented", "output" : "out" } -} ] \ No newline at end of file +} ] diff --git a/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/InMemoryConfigSource.java b/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/InMemoryConfigSource.java new file mode 100644 index 000000000..533bba3fd --- /dev/null +++ b/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/InMemoryConfigSource.java @@ -0,0 +1,39 @@ +package io.smallrye.reactive.messaging.kafka.base; + +import java.util.Map; +import java.util.Set; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +/** + * An in-memory {@link ConfigSource} backed by a simple {@link Map}. + * Used to register test configuration programmatically without writing to disk. + */ +public class InMemoryConfigSource implements ConfigSource { + + private final Map properties; + + public InMemoryConfigSource(Map properties) { + this.properties = properties; + } + + @Override + public Set getPropertyNames() { + return properties.keySet(); + } + + @Override + public String getValue(String propertyName) { + return properties.get(propertyName); + } + + @Override + public String getName() { + return "in-memory-test-config"; + } + + @Override + public int getOrdinal() { + return ConfigSource.DEFAULT_ORDINAL; + } +} diff --git a/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/WeldTestBase.java b/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/WeldTestBase.java index 723561faa..70a160dde 100644 --- a/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/WeldTestBase.java +++ b/smallrye-reactive-messaging-kafka/src/test/java/io/smallrye/reactive/messaging/kafka/base/WeldTestBase.java @@ -1,5 +1,8 @@ package io.smallrye.reactive.messaging.kafka.base; +import java.util.HashMap; +import java.util.Map; + import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.spi.BeanManager; @@ -11,6 +14,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import io.smallrye.config.SmallRyeConfigBuilder; import io.smallrye.config.SmallRyeConfigProviderResolver; import io.smallrye.config.inject.ConfigExtension; import io.smallrye.mutiny.infrastructure.Infrastructure; @@ -162,21 +166,31 @@ public T runApplication(MapBasedConfig config, Class clazz) { } public void runApplication(MapBasedConfig config) { - if (config != null) { - config.write(); - } else { - MapBasedConfig.cleanup(); - } - + installConfig(config); container = weld.initialize(); } public static void addConfig(KafkaMapBasedConfig config) { + installConfig(config); + } + + private static void installConfig(MapBasedConfig config) { + // Release any previously registered config + SmallRyeConfigProviderResolver.instance().releaseConfig(ConfigProvider.getConfig()); + + Map properties = new HashMap<>(); if (config != null) { - config.write(); - } else { - KafkaMapBasedConfig.cleanup(); + config.forEach((key, value) -> properties.put(key, value.toString())); } + + // Build and register an in-memory SmallRye Config + SmallRyeConfigProviderResolver.instance().registerConfig( + new SmallRyeConfigBuilder() + .addDefaultSources() + .addDefaultInterceptors() + .withSources(new InMemoryConfigSource(properties)) + .build(), + Thread.currentThread().getContextClassLoader()); } public HealthCenter getHealth() {