@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    @Bean(name = "storeProductTaskExecutor")
    public ThreadPoolTaskExecutor storeProductTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(6); // 6 потоков для 4 ядер
        executor.setMaxPoolSize(12); // Максимум 12 потоков
        executor.setQueueCapacity(50); // Очередь на 50 задач
        executor.setThreadNamePrefix("StoreFetchThread-");
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(1800); // Ждать завершения задач до 0.5 часа
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) -> {
            System.err.println("Async error in " + method.getName() + " with params " + Arrays.toString(params) + ": " + ex.getMessage());
        };
    }
}

@Configuration
public class CaffeineConfig {
    @Value("${cache.caffeine.maxSize:524288000}")
    private long maxSize;
    @Value("${cache.caffeine.ttl.productCostMinutes:30000}")
    private long productCostTtlMinutes;
    @Value("${cache.caffeine.ttl.totalCostMinutes:30000}")
    private long totalCostTtlMinutes;
    @Value("${cache.caffeine.ttl.taxesMinutes:30000}")
    private long taxesTtlMinutes;
    @Value("${cache.caffeine.ttl.operationalCostsMinutes:30000}")
    private long operationalCostsTtlMinutes;

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(
                new CaffeineCache("productCost",
                        Caffeine.newBuilder()
                                .maximumSize(maxSize)
                                .expireAfterWrite(productCostTtlMinutes, TimeUnit.MINUTES)
                                .build()),
                new CaffeineCache("sellerTotalCost",
                        Caffeine.newBuilder()
                                .maximumSize(maxSize)
                                .expireAfterWrite(totalCostTtlMinutes, TimeUnit.MINUTES)
                                .build()),
                new CaffeineCache("tax",
                        Caffeine.newBuilder()
                                .maximumSize(maxSize)
                                .expireAfterWrite(taxesTtlMinutes, TimeUnit.MINUTES)
                                .build()),
                new CaffeineCache("operationalCost",
                        Caffeine.newBuilder()
                                .maximumSize(maxSize)
                                .expireAfterWrite(operationalCostsTtlMinutes, TimeUnit.MINUTES)
                                .build())
        ));
        return cacheManager;
    }
}

@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@Table(name = "stores", schema = "finance_report")
public class Store {

    @Id
    @Column(name = "store_id")
    private UUID storeId;

    @Column(name = "seller_id")
    private UUID sellerId;

    @Column(name = "apiKey")
    private String apiKey;

    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false)
    private Status status;

    @CreatedDate
    @Column(name = "created_at", updatable = false, nullable = false)
    private Instant createdAt;

    @LastModifiedDate
    @Column(name = "modified_at", nullable = false)
    private Instant modifiedAt;
}

public enum Status {
    PENDING_CONFIRMATION,
    ACTIVE,
    SUSPENDED,
    BLOCK
}

Напиши реализацию сервиса, в том же SPring Boot 3.4.4 приложении, который будет 
1. ПОлучать команду по эндпойнту от микросервиса One, по который наш сервис запросит у сервиса APiKeyStorage apiKey сохранит его в coffeine и в бд.
2. Который по расписанию будет обновлять apiKey для всех storeId в APiKeyStorage
запрашивать apiKey у другого микросервиса
Данны сервис использует storeProductTaskExecutor