|
|
package com.ruoyi.imserver.netty;
|
|
|
|
|
|
|
|
|
import com.ruoyi.common.im.constant.IMRedisKey;
|
|
|
import com.ruoyi.common.im.mq.RedisMQTemplate;
|
|
|
import io.netty.channel.EventLoopGroup;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.boot.CommandLineRunner;
|
|
|
import org.springframework.context.SmartLifecycle;
|
|
|
import org.springframework.data.redis.connection.RedisConnection;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import javax.annotation.PreDestroy;
|
|
|
import java.util.List;
|
|
|
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@AllArgsConstructor
|
|
|
public class IMServerGroup implements CommandLineRunner {
|
|
|
|
|
|
public static volatile long serverId = 0;
|
|
|
|
|
|
private final RedisMQTemplate redisMQTemplate;
|
|
|
|
|
|
private final List<IMServer> imServers;
|
|
|
|
|
|
/***
|
|
|
* 判断服务器是否就绪
|
|
|
*
|
|
|
**/
|
|
|
public boolean isReady() {
|
|
|
for (IMServer imServer : imServers) {
|
|
|
if (!imServer.isReady()) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void run(String... args) {
|
|
|
try {
|
|
|
System.out.println("========== IMServerGroup 开始初始化 ==========");
|
|
|
|
|
|
// 1. 先验证Redis连接
|
|
|
if (!testRedisConnection()) {
|
|
|
// 不要直接退出,记录错误,让应用继续启动(如果需要)
|
|
|
System.err.println("严重:Redis连接失败,但应用将继续启动(部分功能可能不可用)");
|
|
|
// 根据业务决定:如果Redis是必须的,可以抛出异常:
|
|
|
// throw new RuntimeException("Redis连接失败,应用启动中止");
|
|
|
}
|
|
|
String key = IMRedisKey.IM_MAX_SERVER_ID;
|
|
|
serverId = redisMQTemplate.opsForValue().increment(key, 1);
|
|
|
|
|
|
|
|
|
for (IMServer imServer : imServers) {
|
|
|
imServer.start();
|
|
|
}
|
|
|
|
|
|
System.out.println("========== IMServerGroup 初始化完成 ==========");
|
|
|
}catch (Exception e) {
|
|
|
// 捕获所有异常,打印详细信息,但可以选择不向上抛出,防止应用退出
|
|
|
System.err.println("IMServerGroup 初始化过程中发生严重错误:");
|
|
|
e.printStackTrace(); // 打印完整的堆栈跟踪,这能帮你定位到具体行号
|
|
|
// 重要决策:是否重新抛出异常?
|
|
|
// 如果希望应用继续运行(比如Redis失败但想先看其他功能),就注释掉下一行
|
|
|
// 如果希望应用停止,就保留下一行
|
|
|
// throw new RuntimeException("IMServerGroup启动失败", e);
|
|
|
}
|
|
|
}
|
|
|
private boolean testRedisConnection() {
|
|
|
try {
|
|
|
// 使用你之前编写的连接测试代码
|
|
|
// 例如:String pong = redisTemplate.getConnectionFactory().getConnection().ping();
|
|
|
|
|
|
String pong = redisMQTemplate.getConnectionFactory().getConnection().ping();
|
|
|
System.out.println("Redis连接测试成功 "+pong);
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
System.err.println("Redis连接测试失败: " + e.getClass().getName() + " - " + e.getMessage());
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@PreDestroy
|
|
|
public void destroy() {
|
|
|
// 停止服务
|
|
|
log.info("消费线程停止12...");
|
|
|
for (IMServer imServer : imServers) {
|
|
|
imServer.stop();
|
|
|
}
|
|
|
}
|
|
|
}
|