OutboxProperties.java
package com.ecommerce.inventory.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.inventory.outbox")
public record OutboxProperties(
boolean enabled,
@NotBlank String endpoints,
@NotBlank String topic,
@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 {
parallelism = parallelism == 0 ? 8 : parallelism;
leaseDuration = leaseDuration == null ? Duration.ofSeconds(60) : leaseDuration;
shutdownAwait = shutdownAwait == null ? Duration.ofSeconds(10) : shutdownAwait;
if (leaseDuration.isNegative()
|| leaseDuration.isZero()
|| leaseDuration.compareTo(Duration.ofMinutes(10)) > 0) {
throw new IllegalArgumentException(
"ecommerce.inventory.outbox.lease-duration must be between 1ms and 10m");
}
if (shutdownAwait.isNegative()
|| shutdownAwait.isZero()
|| shutdownAwait.compareTo(Duration.ofSeconds(30)) > 0) {
throw new IllegalArgumentException(
"ecommerce.inventory.outbox.shutdown-await must be between 1ms and 30s");
}
}
}