feat(native): onboard the database and messaging driver batch

Batch 2 joins the native line: mysql, postgresql, sqlserver, oracle,
redis and kafka - database dialects and messaging clients, all pure
Java. DriverNativeRuntimeHints gains the four JDBC dialect driver
constructors (string-based TypeReferences; each class exists only on
its own driver's classpath and native-image ignores hints for absent
classes). Same generated shape as the previous batches: targets, matrix
entries, compose blocks and per-driver agent snapshots.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
pnoker
2026-10-14 01:21:49 +08:00
co-authored by Claude Code
parent 61420025e7
commit b73e4cfa35
10 changed files with 31529 additions and 0 deletions
+9
View File
@@ -319,6 +319,9 @@ jobs:
# Batch 1a — pure-Java protocol stacks (no JNI dependencies).
# Batch 1b — pure-Java protocol SDKs (iec61850 GOOSE raw-ethernet
# paths remain untested on native; validated in TCP mode only).
# Batch 2 — database and messaging clients (JDBC dialects, redis,
# kafka); JDBC driver constructors registered in
# DriverNativeRuntimeHints.
# Later batches append here; the target name and the
# NATIVE_SERVICE build arg are the same value by construction.
- dc3-driver-virtual
@@ -341,6 +344,12 @@ jobs:
- dc3-driver-opc-ua
- dc3-driver-lwm2m
- dc3-driver-iec61850
- dc3-driver-mysql
- dc3-driver-postgresql
- dc3-driver-sqlserver
- dc3-driver-oracle
- dc3-driver-redis
- dc3-driver-kafka
env:
SERVICE: ${{ matrix.service }}
steps:
+78
View File
@@ -1232,3 +1232,81 @@ VOLUME /dc3-driver/dc3-driver-iec61850/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-iec61850/dc3/data/driver/iec61850
VOLUME /dc3-driver/dc3-driver-iec61850/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-mysql-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-mysql.
FROM native-runtime-base AS dc3-driver-mysql-native
ENV SERVER_NAME=dc3-driver-mysql
ENV APP_BIN=./dc3-driver-mysql
WORKDIR /dc3-driver/dc3-driver-mysql
RUN mkdir -p /dc3-driver/dc3-driver-mysql/dc3/logs/driver/mysql
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-mysql/target/dc3-driver-mysql ./
VOLUME /dc3-driver/dc3-driver-mysql/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-mysql/dc3/data/driver/mysql
VOLUME /dc3-driver/dc3-driver-mysql/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-postgresql-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-postgresql.
FROM native-runtime-base AS dc3-driver-postgresql-native
ENV SERVER_NAME=dc3-driver-postgresql
ENV APP_BIN=./dc3-driver-postgresql
WORKDIR /dc3-driver/dc3-driver-postgresql
RUN mkdir -p /dc3-driver/dc3-driver-postgresql/dc3/logs/driver/postgresql
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-postgresql/target/dc3-driver-postgresql ./
VOLUME /dc3-driver/dc3-driver-postgresql/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-postgresql/dc3/data/driver/postgresql
VOLUME /dc3-driver/dc3-driver-postgresql/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-sqlserver-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-sqlserver.
FROM native-runtime-base AS dc3-driver-sqlserver-native
ENV SERVER_NAME=dc3-driver-sqlserver
ENV APP_BIN=./dc3-driver-sqlserver
WORKDIR /dc3-driver/dc3-driver-sqlserver
RUN mkdir -p /dc3-driver/dc3-driver-sqlserver/dc3/logs/driver/sqlserver
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-sqlserver/target/dc3-driver-sqlserver ./
VOLUME /dc3-driver/dc3-driver-sqlserver/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-sqlserver/dc3/data/driver/sqlserver
VOLUME /dc3-driver/dc3-driver-sqlserver/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-oracle-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-oracle.
FROM native-runtime-base AS dc3-driver-oracle-native
ENV SERVER_NAME=dc3-driver-oracle
ENV APP_BIN=./dc3-driver-oracle
WORKDIR /dc3-driver/dc3-driver-oracle
RUN mkdir -p /dc3-driver/dc3-driver-oracle/dc3/logs/driver/oracle
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-oracle/target/dc3-driver-oracle ./
VOLUME /dc3-driver/dc3-driver-oracle/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-oracle/dc3/data/driver/oracle
VOLUME /dc3-driver/dc3-driver-oracle/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-redis-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-redis.
FROM native-runtime-base AS dc3-driver-redis-native
ENV SERVER_NAME=dc3-driver-redis
ENV APP_BIN=./dc3-driver-redis
WORKDIR /dc3-driver/dc3-driver-redis
RUN mkdir -p /dc3-driver/dc3-driver-redis/dc3/logs/driver/redis
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-redis/target/dc3-driver-redis ./
VOLUME /dc3-driver/dc3-driver-redis/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-redis/dc3/data/driver/redis
VOLUME /dc3-driver/dc3-driver-redis/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
# ---------- dc3-driver-kafka-native ----------
# Requires --build-arg NATIVE_SERVICE=dc3-driver-kafka.
FROM native-runtime-base AS dc3-driver-kafka-native
ENV SERVER_NAME=dc3-driver-kafka
ENV APP_BIN=./dc3-driver-kafka
WORKDIR /dc3-driver/dc3-driver-kafka
RUN mkdir -p /dc3-driver/dc3-driver-kafka/dc3/logs/driver/kafka
COPY --from=driver-native-builder /build/dc3-driver/dc3-driver-kafka/target/dc3-driver-kafka ./
VOLUME /dc3-driver/dc3-driver-kafka/dc3/logs
RUN mkdir -p /dc3-driver/dc3-driver-kafka/dc3/data/driver/kafka
VOLUME /dc3-driver/dc3-driver-kafka/dc3/data
ENTRYPOINT ["/usr/share/dc3/entrypoint-native.sh"]
@@ -321,6 +321,18 @@ public class DriverNativeRuntimeHints implements RuntimeHintsRegistrar {
"io.github.pnoker.common.driver.receiver.rabbit.PointCommandReceiver"
};
/**
* JDBC dialect drivers of the database driver batch, instantiated
* reflectively by DriverManager / HikariCP. String-based references:
* each class exists only on its own driver's classpath.
*/
private static final String[] JDBC_DRIVER_CLASSES = {
"com.mysql.cj.jdbc.Driver",
"org.postgresql.Driver",
"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"oracle.jdbc.driver.OracleDriver"
};
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
// Driver profile defaults shipped inside this SDK jar; without the
@@ -376,6 +388,15 @@ public class DriverNativeRuntimeHints implements RuntimeHintsRegistrar {
// drivers through this ServiceLoader descriptor.
hints.resources().registerPattern("META-INF/services/java.sql.Driver");
// JDBC driver batch (mysql / postgresql / sqlserver / oracle): the
// dialect drivers are instantiated reflectively by DriverManager /
// HikariCP. String-based TypeReferences - the classes only exist on
// the JDBC drivers' classpaths, and hints for absent classes are
// ignored by native-image.
for (String name : JDBC_DRIVER_CLASSES) {
hints.reflection().registerType(TypeReference.of(name), MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS);
}
for (String name : CAFFEINE_POLICY_CLASSES) {
hints.reflection()
.registerType(
+155
View File
@@ -790,6 +790,161 @@ services:
dc3net:
aliases:
- dc3-driver-iec61850
mysql:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-mysql-native
args:
NATIVE_SERVICE: dc3-driver-mysql
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-mysql:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-mysql
hostname: dc3-driver-mysql
volumes:
- logs:/dc3-driver/dc3-driver-mysql/dc3/logs
- driver_data:/dc3-driver/dc3-driver-mysql/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-mysql
postgresql:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-postgresql-native
args:
NATIVE_SERVICE: dc3-driver-postgresql
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-postgresql:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-postgresql
hostname: dc3-driver-postgresql
volumes:
- logs:/dc3-driver/dc3-driver-postgresql/dc3/logs
- driver_data:/dc3-driver/dc3-driver-postgresql/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-postgresql
sqlserver:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-sqlserver-native
args:
NATIVE_SERVICE: dc3-driver-sqlserver
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-sqlserver:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-sqlserver
hostname: dc3-driver-sqlserver
volumes:
- logs:/dc3-driver/dc3-driver-sqlserver/dc3/logs
- driver_data:/dc3-driver/dc3-driver-sqlserver/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-sqlserver
oracle:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-oracle-native
args:
NATIVE_SERVICE: dc3-driver-oracle
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-oracle:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-oracle
hostname: dc3-driver-oracle
volumes:
- logs:/dc3-driver/dc3-driver-oracle/dc3/logs
- driver_data:/dc3-driver/dc3-driver-oracle/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-oracle
redis:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-redis-native
args:
NATIVE_SERVICE: dc3-driver-redis
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-redis:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-redis
hostname: dc3-driver-redis
volumes:
- logs:/dc3-driver/dc3-driver-redis/dc3/logs
- driver_data:/dc3-driver/dc3-driver-redis/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-redis
kafka:
profiles: [ "native-drivers" ]
build:
context: ..
dockerfile: Dockerfile
target: dc3-driver-kafka-native
args:
NATIVE_SERVICE: dc3-driver-kafka
image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-driver-kafka:${DC3_IMAGE_TAG:-2026.9}-native
restart: always
depends_on:
manager:
condition: service_healthy
environment:
<<: *app-runtime-env
container_name: dc3-driver-kafka
hostname: dc3-driver-kafka
volumes:
- logs:/dc3-driver/dc3-driver-kafka/dc3/logs
- driver_data:/dc3-driver/dc3-driver-kafka/dc3/data
logging: *default-logging
networks:
dc3net:
aliases:
- dc3-driver-kafka
volumes:
logs: