The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
170 lines
27 KiB
XML
170 lines
27 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="2724" viewBox="0 0 1200 2724" role="img">
|
|
<title>terminal evidence</title>
|
|
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
|
|
<rect x="1" y="1" width="1198" height="2722" rx="14" fill="#0d1117" stroke="#30363d"/>
|
|
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
|
|
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
|
|
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
|
|
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
|
|
<circle cx="64" cy="22" r="6" fill="#28c840"/>
|
|
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
|
|
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
|
|
set -o pipefail
|
|
L=src/messaging/messaging-cloudevents
|
|
strip() { sed -E 's#^src/[^:]*/src/(main|test)/[^:]*/([^:</tspan><tspan x="24" dy="22">/]+):([0-9]+):# \1 · \2:\3 #'; }
|
|
|
|
echo "# 이 leaf 가 담은 파일과 줄 수"
|
|
for f in $(find $L/src -name '*.java' | sort);</tspan><tspan x="24" dy="22"> do
|
|
set=$(echo "$f" | sed -E 's#.*/src/([a-z]+)/.*#\1#')
|
|
printf " %-8s %-32s %s 줄\n" "$set" "$(basename $f)" "$(wc</tspan><tspan x="24" dy="22"> -l < $f)"
|
|
done
|
|
|
|
echo
|
|
echo "# 출하 산출물에 들어간다는 것을 무엇이 말하는가"
|
|
python3 - <<'PY'
|
|
import json
|
|
d = json.load(</tspan><tspan x="24" dy="22">open('src/config/architecture/modules.json'))
|
|
def walk(o):
|
|
if isinstance(o, dict):
|
|
if o.get('id') == 'messag</tspan><tspan x="24" dy="22">ing-cloudevents':
|
|
print(f" modules.json runtime_memberships={o.get('runtime_memberships')}")
|
|
for v</tspan><tspan x="24" dy="22"> in o.values(): walk(v)
|
|
elif isinstance(o, list):
|
|
for v in o: walk(v)
|
|
walk(d)
|
|
PY
|
|
awk 'NR>=24 && NR<=26 {prin</tspan><tspan x="24" dy="22">tf " messaging-spring-boot-starter/build.gradle:%d %s\n", NR, $0}' src/messaging/messaging-spring-boot-starter/build.gr</tspan><tspan x="24" dy="22">adle
|
|
grep -n 'messaging-cloudevents' src/app-bootstrap/build/architecture/runtime-project-closure.txt 2>/dev/null \
|
|
| </tspan><tspan x="24" dy="22">sed 's#^# app-bootstrap/build/architecture/runtime-project-closure.txt:#' || echo " (closure 파일 없음)"
|
|
grep -n 'io.c</tspan><tspan x="24" dy="22">loudevents' src/app-bootstrap/gradle.lockfile | sed 's#^# app-bootstrap/gradle.lockfile:#'
|
|
|
|
echo
|
|
echo "# DefaultCloudEv</tspan><tspan x="24" dy="22">entMapper 를 만드는 자리, 그리고 계약 타입을 참조하는 main 파일"
|
|
git grep -n 'new DefaultCloudEventMapper' -- 'src/**/*.</tspan><tspan x="24" dy="22">java' | strip
|
|
git grep -l 'CloudEventMapper\|CloudEventExtensions' -- 'src/**/*.java' | grep '/main/' | sed 's#^src/# #</tspan><tspan x="24" dy="22">'
|
|
|
|
echo
|
|
echo "# CloudEvent 라는 이름을 main 자바 소스 전체에서 찾으면"
|
|
git grep -l 'CloudEvent' -- 'src/**/*.java' | gre</tspan><tspan x="24" dy="22">p '/main/' | sed 's#^src/# #'
|
|
echo " 설정 클래스 계수 :"
|
|
a=$(find src -name '*AutoConfiguration.java' -path '*/main/*'</tspan><tspan x="24" dy="22"> | wc -l || true)
|
|
c=$(git grep -l '@Configuration' -- 'src/**/*.java' | grep -c '/main/' || true)
|
|
i=$(find src -name 'or</tspan><tspan x="24" dy="22">g.springframework.boot.autoconfigure.AutoConfiguration.imports' -not -path '*/build/*' -exec grep -ch . {} + | awk '{s+=</tspan><tspan x="24" dy="22">$1} END {print s}')
|
|
echo " 이름이 *AutoConfiguration.java 인 main 클래스 : $a"
|
|
echo " @Configuration 을 단 main 클</tspan><tspan x="24" dy="22">래스 : $c"
|
|
echo " AutoConfiguration.imports 등재 클래스 : $i"
|
|
echo " 그 어느 집합에서도 CloudE</tspan><tspan x="24" dy="22">vent 를 언급하는 것 : 0 (위 main 전수 목록이 leaf 세 파일뿐이므로)"
|
|
echo " META-INF/services 파일 수 : $(find src -path</tspan><tspan x="24" dy="22"> '*/META-INF/services/*' -not -path '*/build/*' | wc -l || true)"
|
|
|
|
echo
|
|
echo "# 원문이 28 로 적은 수의 출처"
|
|
echo -n " </tspan><tspan x="24" dy="22">starter autoconfigure 패키지 파일 수 : "
|
|
ls src/messaging/messaging-spring-boot-starter/src/main/java/dev/caskeleton/mes</tspan><tspan x="24" dy="22">saging/autoconfigure/ | wc -l
|
|
echo -n " 그중 이름이 *AutoConfiguration 인 것 : "
|
|
ls src/messaging/messaging-spring-boot</tspan><tspan x="24" dy="22">-starter/src/main/java/dev/caskeleton/messaging/autoconfigure/ | grep -c AutoConfiguration || true
|
|
|
|
echo
|
|
echo "# 매핑의 </tspan><tspan x="24" dy="22">반대편 — CanonicalEnvelopeHeaders 를 쓰는 main 코드와 그 성격"
|
|
git grep -n 'CanonicalEnvelopeHeaders\.' -- 'src/**/*.ja</tspan><tspan x="24" dy="22">va' | grep '/main/' | strip
|
|
echo " 그 넷은 값을 싣는 곳이 아니라 거절·건너뛰기 판정이다 :"
|
|
awk 'NR>=88 && NR<=92 {prin</tspan><tspan x="24" dy="22">tf " KafkaHeaderMapper.java:%d %s\n", NR, $0}' src/messaging/messaging-kafka/src/main/java/dev/caskeleton/messaging/kaf</tspan><tspan x="24" dy="22">ka/KafkaHeaderMapper.java
|
|
echo " 실제로 헤더를 싣는 줄은 따로 있다 :"
|
|
awk 'NR>=36 && NR<=44 && /put\(headers/ {printf "</tspan><tspan x="24" dy="22"> KafkaHeaderMapper.java:%d %s\n", NR, $0}' src/messaging/messaging-kafka/src/main/java/dev/caskeleton/messaging/kafka/K</tspan><tspan x="24" dy="22">afkaHeaderMapper.java
|
|
|
|
echo
|
|
echo "# 그 네 호출 중 조립되는 경로에 있는 것"
|
|
git grep -n 'new KafkaHeaderMapper()\|new Rab</tspan><tspan x="24" dy="22">bitHeaderMapper()' -- 'src/**/*.java' | grep -E '/(main|test)/' | strip
|
|
echo " 그 위의 transport 를 만드는 main 코드 :"</tspan><tspan x="24" dy="22">
|
|
for t in KafkaMessagingTransport RabbitMessagingTransport; do
|
|
h=$(git grep -n "$t" -- 'src/**/*.java' | grep '/main/'</tspan><tspan x="24" dy="22"> | grep -v "/$t.java" | grep 'new ' || true)
|
|
if [ -z "$h" ]; then echo " $t : main 생성 0 건"; else echo "$h" | str</tspan><tspan x="24" dy="22">ip; fi
|
|
done
|
|
|
|
echo
|
|
echo "# 상호운용을 약속한 문서와, 약속이 없는 문서"
|
|
grep -rn 'CloudEvents' docs/superpowers/specs/2026</tspan><tspan x="24" dy="22">-08-10-messaging-platform-design.md 2>/dev/null | head -2 | cut -c1-140 | sed 's#^# #'
|
|
for f in docs/messaging/support-</tspan><tspan x="24" dy="22">matrix.md docs/messaging/configuration-reference.md; do
|
|
n=$(grep -ci 'cloudevent' $f 2>/dev/null || true)
|
|
printf " </tspan><tspan x="24" dy="22">%-46s CloudEvents 언급 %s 건\n" "$f" "${n:-0}"
|
|
done
|
|
</tspan></text>
|
|
<text x="24" y="882" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template</tspan></text>
|
|
<text x="24" y="904" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-04T00:26:36+00:00 · exit 0</tspan></text>
|
|
<line x1="24" y1="918" x2="1176" y2="918" stroke="#30363d"/>
|
|
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 이 leaf 가 담은 파일과 줄 수</tspan></text>
|
|
<text x="24" y="980" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main CloudEventExtensions.java 24 줄</tspan></text>
|
|
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main CloudEventMapper.java 33 줄</tspan></text>
|
|
<text x="24" y="1024" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main DefaultCloudEventMapper.java 171 줄</tspan></text>
|
|
<text x="24" y="1046" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test CloudEventMappingTest.java 162 줄</tspan></text>
|
|
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1090" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 출하 산출물에 들어간다는 것을 무엇이 말하는가</tspan></text>
|
|
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> modules.json runtime_memberships=['app-bootstrap']</tspan></text>
|
|
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging-spring-boot-starter/build.gradle:24 // Wired by the auto-configurations and never named in an adopter's source.</tspan></text>
|
|
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging-spring-boot-starter/build.gradle:25 implementation project(':messaging:messaging-schema-json')</tspan></text>
|
|
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging-spring-boot-starter/build.gradle:26 implementation project(':messaging:messaging-cloudevents')</tspan></text>
|
|
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> app-bootstrap/build/architecture/runtime-project-closure.txt:18:messaging-cloudevents</tspan></text>
|
|
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> app-bootstrap/gradle.lockfile:101:io.cloudevents:cloudevents-api:4.0.1=productionRuntimeClasspath,runtimeClasspath,sampleOffTe</tspan><tspan x="24" dy="22">stRuntimeClasspath,testRuntimeClasspath</tspan></text>
|
|
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> app-bootstrap/gradle.lockfile:102:io.cloudevents:cloudevents-core:4.0.1=productionRuntimeClasspath,runtimeClasspath,sampleOffT</tspan><tspan x="24" dy="22">estRuntimeClasspath,testRuntimeClasspath</tspan></text>
|
|
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># DefaultCloudEventMapper 를 만드는 자리, 그리고 계약 타입을 참조하는 main 파일</tspan></text>
|
|
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · CloudEventMappingTest.java:30 private final DefaultCloudEventMapper mapper = new DefaultCloudEventMapper();</tspan></text>
|
|
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventExtensions.java</tspan></text>
|
|
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventMapper.java</tspan></text>
|
|
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/DefaultCloudEventMapper.java</tspan></text>
|
|
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># CloudEvent 라는 이름을 main 자바 소스 전체에서 찾으면</tspan></text>
|
|
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventExtensions.java</tspan></text>
|
|
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventMapper.java</tspan></text>
|
|
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/DefaultCloudEventMapper.java</tspan></text>
|
|
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 설정 클래스 계수 :</tspan></text>
|
|
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이름이 *AutoConfiguration.java 인 main 클래스 : 36</tspan></text>
|
|
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> @Configuration 을 단 main 클래스 : 176</tspan></text>
|
|
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> AutoConfiguration.imports 등재 클래스 : 14</tspan></text>
|
|
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 어느 집합에서도 CloudEvent 를 언급하는 것 : 0 (위 main 전수 목록이 leaf 세 파일뿐이므로)</tspan></text>
|
|
<text x="24" y="1662" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> META-INF/services 파일 수 : 0</tspan></text>
|
|
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 원문이 28 로 적은 수의 출처</tspan></text>
|
|
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> starter autoconfigure 패키지 파일 수 : 28</tspan></text>
|
|
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그중 이름이 *AutoConfiguration 인 것 : 6</tspan></text>
|
|
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 매핑의 반대편 — CanonicalEnvelopeHeaders 를 쓰는 main 코드와 그 성격</tspan></text>
|
|
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · KafkaHeaderMapper.java:90 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {</tspan></text>
|
|
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · KafkaHeaderMapper.java:141 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(header.key())) {</tspan></text>
|
|
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RabbitHeaderMapper.java:102 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {</tspan></text>
|
|
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RabbitHeaderMapper.java:158 if (value != null && !CanonicalEnvelopeHeaders.restatesEnvelopeField(name)) </tspan><tspan x="24" dy="22">{</tspan></text>
|
|
<text x="24" y="1926" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 넷은 값을 싣는 곳이 아니라 거절·건너뛰기 판정이다 :</tspan></text>
|
|
<text x="24" y="1948" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:88 .forEach(</tspan></text>
|
|
<text x="24" y="1970" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:89 (name, value) -> {</tspan></text>
|
|
<text x="24" y="1992" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:90 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {</tspan></text>
|
|
<text x="24" y="2014" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:91 throw new dev.caskeleton.messaging.api.error.MessagingConfigurationException(</tspan></text>
|
|
<text x="24" y="2036" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:92 "RESERVED_HEADER_FORGED",</tspan></text>
|
|
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 실제로 헤더를 싣는 줄은 따로 있다 :</tspan></text>
|
|
<text x="24" y="2080" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:36 put(headers, ReservedHeaders.MESSAGE_ID, envelope.messageId().value().toString());</tspan></text>
|
|
<text x="24" y="2102" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:37 put(headers, ReservedHeaders.MESSAGE_TYPE, envelope.messageType().value());</tspan></text>
|
|
<text x="24" y="2124" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:42 put(headers, ReservedHeaders.PRODUCER, envelope.producer().value());</tspan></text>
|
|
<text x="24" y="2146" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:43 put(headers, ReservedHeaders.PRODUCED_AT, envelope.producedAt().toString());</tspan></text>
|
|
<text x="24" y="2168" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaHeaderMapper.java:44 put(headers, ReservedHeaders.CONTENT_TYPE, envelope.contentType().value());</tspan></text>
|
|
<text x="24" y="2190" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2212" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 네 호출 중 조립되는 경로에 있는 것</tspan></text>
|
|
<text x="24" y="2234" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · KafkaDeliveryMapper.java:42 this(new KafkaHeaderMapper());</tspan></text>
|
|
<text x="24" y="2256" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · KafkaPublishMapper.java:34 this(new KafkaHeaderMapper());</tspan></text>
|
|
<text x="24" y="2278" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · KafkaEnvelopeRoundTripTest.java:39 private final KafkaHeaderMapper headerMapper = new KafkaHeaderMapper();</tspan></text>
|
|
<text x="24" y="2300" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · KafkaHeaderMapperTest.java:27 private final KafkaHeaderMapper mapper = new KafkaHeaderMapper();</tspan></text>
|
|
<text x="24" y="2322" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · ReservedHeaderForgeryTest.java:36 private final KafkaHeaderMapper mapper = new KafkaHeaderMapper();</tspan></text>
|
|
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RabbitDeliveryMapper.java:41 this(new RabbitHeaderMapper());</tspan></text>
|
|
<text x="24" y="2366" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RabbitPublishMapper.java:22 this(new RabbitHeaderMapper());</tspan></text>
|
|
<text x="24" y="2388" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · RabbitEnvelopeRoundTripTest.java:43 private final RabbitHeaderMapper headerMapper = new RabbitHeaderMapper();</tspan></text>
|
|
<text x="24" y="2410" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · RabbitRuntimeTest.java:126 RabbitHeaderMapper headers = new RabbitHeaderMapper();</tspan></text>
|
|
<text x="24" y="2432" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · RabbitRuntimeTest.java:140 RabbitHeaderMapper headers = new RabbitHeaderMapper();</tspan></text>
|
|
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · RabbitRuntimeTest.java:231 new RabbitHeaderMapper().toProperties(envelope(new byte[] {1})));</tspan></text>
|
|
<text x="24" y="2476" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 위의 transport 를 만드는 main 코드 :</tspan></text>
|
|
<text x="24" y="2498" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · KafkaMessagingAutoConfiguration.java:168 return new dev.caskeleton.messaging.kafka.KafkaMessagingTransport("kafka"</tspan><tspan x="24" dy="22">, 1L, producer);</tspan></text>
|
|
<text x="24" y="2542" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingTransport : main 생성 0 건</tspan></text>
|
|
<text x="24" y="2564" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2586" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 상호운용을 약속한 문서와, 약속이 없는 문서</tspan></text>
|
|
<text x="24" y="2608" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 35:| CloudEvents | Domain·Integration Event에 선택 가능한 1.0.2 compatible profile을 제공한다. |</tspan></text>
|
|
<text x="24" y="2630" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 756:## 15. CloudEvents Profile</tspan></text>
|
|
<text x="24" y="2652" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> docs/messaging/support-matrix.md CloudEvents 언급 0 건</tspan></text>
|
|
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> docs/messaging/configuration-reference.md CloudEvents 언급 0 건</tspan></text>
|
|
</svg>
|