EmbeddedRedisInitializer.java 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package com.qqflow.engine.config;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.context.ApplicationContextInitializer;
  4. import org.springframework.context.ConfigurableApplicationContext;
  5. import org.springframework.core.env.Profiles;
  6. import redis.embedded.RedisServer;
  7. import java.io.IOException;
  8. import java.net.Socket;
  9. /**
  10. * 在 Spring Boot 启动最早期启动 Embedded Redis,确保 Redisson 等组件初始化时 Redis 已可用。
  11. * 仅在 dev 环境下生效。
  12. */
  13. @Slf4j
  14. public class EmbeddedRedisInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
  15. private static RedisServer redisServer;
  16. @Override
  17. public void initialize(ConfigurableApplicationContext applicationContext) {
  18. if (!applicationContext.getEnvironment().acceptsProfiles(Profiles.of("dev"))) {
  19. return;
  20. }
  21. if (isPortAvailable(6379)) {
  22. try {
  23. log.info("本地 Redis 未检测到,启动 Embedded Redis (端口: 6379)...");
  24. redisServer = new RedisServer(6379);
  25. redisServer.start();
  26. log.info("Embedded Redis 启动成功");
  27. } catch (IOException e) {
  28. log.error("Embedded Redis 启动失败", e);
  29. }
  30. } else {
  31. log.info("检测到外部 Redis 正在运行 (端口: 6379),跳过 Embedded Redis 启动");
  32. }
  33. }
  34. private boolean isPortAvailable(int port) {
  35. try (Socket socket = new Socket("localhost", port)) {
  36. return false;
  37. } catch (IOException e) {
  38. return true;
  39. }
  40. }
  41. public static RedisServer getRedisServer() {
  42. return redisServer;
  43. }
  44. }