# 능력 성분의 아홉째 자리 33: boolean brokerTransaction, # Kafka 가 넘기는 열두 값 (아홉째가 참) new MessagingCapabilities( true, true, true, true, true, true, true, false, true, false, false, true); ^^^^ brokerTransaction # 그 상수 선언이 프로파일을 참조하는가: 0 # 이 플래그를 읽는 main 코드: 0 # 바로 옆 열째 플래그를 읽는 main 코드: DefaultMessagePublisher.java:250: && !transport.capabilities(profile.name()).capabilities().deduplicatedPublish()) { # 그 열째가 거짓인 이유 *

Declaring it true means {@code PublishDeduplication} is accepted and silently does nothing — * the caller believes the broker is deduplicating and skips the idempotency it would otherwise * build. False makes that request a startup failure instead, which is the whole reason the flag * exists. # 트랜잭션 검증기가 요구하는 다섯 30: if (transactionalIdPrefix == null || transactionalIdPrefix.isBlank()) { 34: if (!brokerProfile.enableIdempotence()) { 38: if (!"all".equals(brokerProfile.acks())) { 42: if (brokerProfile.enableAutoCommit()) { 46: if (profile.externalSideEffectGuarantee() == ExternalSideEffectGuarantee.INBOX_TRANSACTIONAL) { if (profile.externalSideEffectGuarantee() == ExternalSideEffectGuarantee.INBOX_TRANSACTIONAL) { throw new IllegalArgumentException( "a Kafka transaction does not cover a database side effect; use the Inbox alone: " + profile.name().value()); } } } # 기동 검증으로 감싸이는 검증기와 직접 불리는 검증기 KafkaMessagingAutoConfiguration.java:54: public StartupProfileValidation MessagingCoreAutoConfiguration.java:216: public StartupProfileValidation RabbitMessagingAutoConfiguration.java:48: public StartupProfileValidation 134: new DestinationProfileValidator().validateAll(registered); # 그런데 트랜잭션 검증기는 그냥 빈이다 @Bean @ConditionalOnMissingBean public KafkaTransactionProfileValidator kafkaTransactionProfileValidator() { return new KafkaTransactionProfileValidator(); } # 자동설정 밖에서 그것을 언급하는 main 코드: 0 # 그것을 만드는 test 코드: 0 # 감쌀 수 없는 이유는 인자 수가 아니다 private final Consumer validator; StartupProfileValidation(Supplier> profiles, Consumer validator) { this.profiles = Objects.requireNonNull(profiles, "profiles must not be null"); this.validator = Objects.requireNonNull(validator, "validator must not be null"); } # 두 번째 인자의 출처 — transactionalIdPrefix 가 나오는 곳: KafkaTransactionProfileValidator.java:21: * @param transactionalIdPrefix the configured transactional id prefix KafkaTransactionProfileValidator.java:26: DestinationProfile profile, String transactionalIdPrefix, KafkaBrokerProfile brokerProfile) { KafkaTransactionProfileValidator.java:30: if (transactionalIdPrefix == null || transactionalIdPrefix.isBlank()) {