11# Multi-stage Dockerfile for TradeStreamEE with Hazelcast Clustering
2- # Uses Azul Platform Prime (Zing) for Pauseless Garbage Collection demonstration
2+ # Uses Azul Zulu 25 with ZGC for low-latency concurrent garbage collection
33
4- FROM azul/zulu-openjdk:21 AS build
4+ FROM azul/zulu-openjdk:25-latest AS build
55WORKDIR /app
66
77# Copy Maven wrapper and pom.xml first for better layer caching
@@ -18,16 +18,16 @@ COPY src ./src
1818RUN ./mvnw spotless:apply
1919RUN ./mvnw clean package -DskipTests
2020
21- # Use Azul Platform Prime for C4 GC
22- FROM azul/prime:21
21+ # Azul Zulu 25 with ZGC for concurrent garbage collection
22+ FROM azul/zulu-openjdk:25-latest
2323
2424LABEL maintainer="TradeStreamEE"
25- LABEL description="High-frequency trading dashboard with Aeron + SBE + Payara Micro + Azul C4 + Hazelcast Clustering"
25+ LABEL description="High-frequency trading dashboard with Aeron + SBE + Payara Micro + Zulu 25 ZGC + Hazelcast Clustering"
2626
2727WORKDIR /opt/payara
2828
2929# Add Payara Micro from URL
30- ARG PAYARA_VERSION=7.2026.3
30+ ARG PAYARA_VERSION=7.2026.5
3131ADD https://nexus.payara.fish/repository/payara-community/fish/payara/extras/payara-micro/${PAYARA_VERSION}/payara-micro-${PAYARA_VERSION}.jar /opt/payara/payara-micro.jar
3232
3333# Copy WAR file from build stage
@@ -39,29 +39,27 @@ RUN mkdir -p /opt/payara/recordings /opt/payara/gc-logs && chmod 777 /opt/payara
3939EXPOSE 8080
4040EXPOSE 5701
4141
42- # Default JVM Options for Azul Platform Prime
42+ # Default JVM Options for Azul Zulu 25 + ZGC
4343#
4444# NOTE: These JAVA_OPTS are defaults for the cluster image. However, when launched
4545# via docker-compose-c4.yml, these values are overridden by environment variables
4646# in that file. See docker-compose-c4.yml for actual runtime flags in cluster mode.
4747#
4848# Reduced heap size (4GB vs 8GB) for multi-instance deployments.
49- # Azul Platform Prime uses C4 GC by default - no need to specify -XX:+UseZGC
49+ # ZGC is a concurrent collector with sub-millisecond pauses on Java 25.
5050#
5151# JFR is OFF by default. Workshop scenarios use ad-hoc recordings via the REST API
5252# (POST /api/jfr/recording/start). To enable a long-running always-on circular
5353# recording, set JFR_ALWAYS_ON=true in the environment.
5454ENV JAVA_OPTS="-Xms4g \
5555 -Xmx4g \
56+ -XX:+UseZGC \
5657 -Xlog:gc*:file=/opt/payara/gc-logs/gc.log:time,uptime,level,tags:filecount=5,filesize=10M \
5758 --add-opens java.base/jdk.internal.misc=ALL-UNNAMED \
5859 --add-opens java.base/sun.nio.ch=ALL-UNNAMED \
5960 --add-opens java.base/java.nio=ALL-UNNAMED \
60- -XX:+UnlockDiagnosticVMOptions \
61- -XX:+UnlockExperimentalVMOptions \
6261 -XX:+AlwaysPreTouch \
6362 -XX:+UseTransparentHugePages \
64- -XX:-UseBiasedLocking \
6563 -XX:+UseStringDeduplication \
6664 -XX:+OptimizeStringConcat \
6765 -Djava.net.preferIPv4Stack=true \
@@ -74,7 +72,7 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
7472# Copy Hazelcast configuration
7573COPY src/main/resources/hazelcast-config.xml /opt/payara/hazelcast-config.xml
7674
77- # Set unique cluster name for C4 environment and update discovery members
75+ # Set unique cluster name for ZGC environment and update discovery members
7876RUN sed -i 's/payara-trader-cluster/payara-trader-c4/' /opt/payara/hazelcast-config.xml && \
7977 sed -i 's/trader-stream-/trader-stream-c4-/' /opt/payara/hazelcast-config.xml
8078
0 commit comments