CatalogCacheProperties.java
package com.ecommerce.catalog.infrastructure.cache;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
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.catalog.cache")
public record CatalogCacheProperties(
boolean enabled,
@NotBlank String namespace,
@Min(100) @Max(100_000) int localMaximumSize,
@NotNull Duration localTtl,
@NotNull Duration freshTtl,
@NotNull Duration staleTtl,
@NotNull Duration negativeTtl,
@DecimalMin("0.0") @DecimalMax("0.5") double ttlJitter,
@NotNull Duration rebuildWait,
@Min(1) @Max(64) int rebuildMaxConcurrent,
@Min(1) @Max(16) int refreshThreads,
@Min(1) @Max(10_000) int refreshQueueCapacity,
@NotNull Duration distributedLockTtl,
@NotBlank String invalidationChannel
) {
public CatalogCacheProperties {
requirePositive(localTtl, "local-ttl");
requirePositive(freshTtl, "fresh-ttl");
requirePositive(staleTtl, "stale-ttl");
requirePositive(negativeTtl, "negative-ttl");
requireNonNegative(rebuildWait, "rebuild-wait");
requirePositive(distributedLockTtl, "distributed-lock-ttl");
}
private static void requirePositive(Duration value, String name) {
if (value == null || value.isZero() || value.isNegative()) {
throw new IllegalArgumentException("ecommerce.catalog.cache." + name + " must be positive");
}
}
private static void requireNonNegative(Duration value, String name) {
if (value == null || value.isNegative()) {
throw new IllegalArgumentException(
"ecommerce.catalog.cache." + name + " must not be negative");
}
}
}