OutboxProperties.java
package com.ecommerce.trade.infrastructure.messaging;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import java.time.Duration;
@Validated
@ConfigurationProperties("ecommerce.trade.outbox")
public record OutboxProperties(
boolean enabled,
@NotBlank String endpoints,
@NotBlank String topic,
@NotBlank String flashSaleTopic,
@Min(100) long fixedDelay,
@NotNull Duration retryDelay,
@Min(1) @Max(500) int batchSize,
@Min(1) @Max(32) int parallelism,
@NotBlank String publisherId,
@NotNull Duration leaseDuration,
@NotNull Duration shutdownAwait
) {
public OutboxProperties {
if (leaseDuration != null
&& (leaseDuration.isZero()
|| leaseDuration.isNegative()
|| leaseDuration.compareTo(Duration.ofMinutes(10)) > 0)) {
throw new IllegalArgumentException("leaseDuration must be greater than zero and at most 10 minutes");
}
if (shutdownAwait != null
&& (shutdownAwait.isZero()
|| shutdownAwait.isNegative()
|| shutdownAwait.compareTo(Duration.ofSeconds(30)) > 0)) {
throw new IllegalArgumentException("shutdownAwait must be greater than zero and at most 30 seconds");
}
}
}