package com.qqflow.engine.config; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Profiles; import redis.embedded.RedisServer; import java.io.IOException; import java.net.Socket; /** * 在 Spring Boot 启动最早期启动 Embedded Redis,确保 Redisson 等组件初始化时 Redis 已可用。 * 仅在 dev 环境下生效。 */ @Slf4j public class EmbeddedRedisInitializer implements ApplicationContextInitializer { private static RedisServer redisServer; @Override public void initialize(ConfigurableApplicationContext applicationContext) { if (!applicationContext.getEnvironment().acceptsProfiles(Profiles.of("dev"))) { return; } if (isPortAvailable(6379)) { try { log.info("本地 Redis 未检测到,启动 Embedded Redis (端口: 6379)..."); redisServer = new RedisServer(6379); redisServer.start(); log.info("Embedded Redis 启动成功"); } catch (IOException e) { log.error("Embedded Redis 启动失败", e); } } else { log.info("检测到外部 Redis 正在运行 (端口: 6379),跳过 Embedded Redis 启动"); } } private boolean isPortAvailable(int port) { try (Socket socket = new Socket("localhost", port)) { return false; } catch (IOException e) { return true; } } public static RedisServer getRedisServer() { return redisServer; } }