3.7 KiB
3.7 KiB
title, source_type, status, related_branches, related_projects, tags, created, status_label
| title | source_type | status | related_branches | related_projects | tags | created | status_label | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| error / slim JRE random generator provider missing (2026-06-24) | error-note | raw |
|
|
|
2026-06-24 | resolved |
error: slim-jre-random-generator-missing
Parent / 부모
증상 / Symptom
- 에러 메시지 (원문 그대로):
Caused by: java.lang.IllegalArgumentException: No implementation of the random number generator algorithm "L32X64MixRandom" is available - 발생 컨텍스트:
bootstrapMigrateAndStart에서 Temurin 21 JRE image의 application context 생성. - 발생 시점: 2026-06-24
- 발생 환경: local Docker,
eclipse-temurin:21-jre-jammyruntime stage. - 재현 가능 여부:
always— 해당 runtime image에서RandomGenerator.getDefault()호출.
재현 절차 / Reproduction
- 기존 코드가
OutboxConfig에서RandomGenerator.getDefault()를 호출하는 app image를 빌드한다. - base/local Compose로 app을 기동한다.
- Flyway는 성공하지만
outboxRelaySchedulerbean 생성에서 context가 종료되고 container가 unhealthy가 된다.
조사 단계 / Investigation log
- 2026-06-24 — Docker health history 확인 → connection refused로 app port가 열리지 않음.
- 2026-06-24 — app logs 확인 → Flyway 3개 migration은 성공했고 이후
outboxRelayScheduler생성에서 예외 발생. - 2026-06-24 — stack trace 역추적 →
OutboxConfig.outboxRelayScheduler의RandomGenerator.getDefault()가L32X64MixRandomprovider를 선택하지만 runtime에서 provider를 찾지 못함. - 2026-06-24 — 최소 회귀 테스트 작성 → composition root RNG bean이
java.basemodule 구현이어야 한다는 테스트를 먼저 compile RED로 확인.
근본 원인 / Root cause
- 직접 원인: default RNG provider lookup이 runtime image에서 사용 불가능한 알고리즘을 선택했다.
- 근본 원인: full local JDK test만으로는 slim JRE runtime module/provider 차이를 검증하지 못했다.
- 트리거 조건:
RandomGenerator.getDefault()를 slim JRE container에서 application startup 중 호출.
Sources / 근거
- raw/branch-notes/feature-developer-experience-contract D3 — 실제 container startup/smoke를 bootstrap에 포함한 결정.
- local stack trace +
OutboxConfigTestRED/GREEN evidence. 외부 공식 자료 조회는 web 403으로 차단되어UNSUPPORTED_DECISION경계를 유지한다.
해결 / Resolution
- 적용한 조치: composition root에
SplittableRandom기반RandomGeneratorbean을 등록하고OutboxBackoffPolicy에 주입. - 검증 방법: bean implementation module이
java.base인지 focused test, 전체test check, 실제./gradlew bootstrap의 container health/HTTP smoke로 확인. - 잔여 위험 / 후속 작업: 다른 runtime-only provider lookup도 container smoke 없이는 같은 종류의 gap이 남을 수 있다.
회고 / Lessons
- 빨리 감지하는 신호: host test green 뒤 container startup에서
No implementation ... algorithm이 나오면 JDK/JRE module/provider parity를 확인한다. - 예방 체크리스트 항목 후보: release runtime image로 application context와 health endpoint를 실제 기동한다.
- wiki로 끌어올릴 가치가 있는 일반화된 교훈: full JDK unit test와 slim JRE runtime parity는 별도 검증 대상이다.