186 lines
8.2 KiB
Java
186 lines
8.2 KiB
Java
package cc.winboll;
|
||
|
||
import cc.winboll.LogUtils;
|
||
import cc.winboll.service.AuthCenterHttpService;
|
||
import cc.winboll.util.AdminUtils;
|
||
import cc.winboll.util.ConsoleInputUtils;
|
||
import cc.winboll.util.EmailSendUtils;
|
||
import cc.winboll.util.EnvInfoUtils;
|
||
import cc.winboll.util.IniConfigUtils;
|
||
import cc.winboll.util.InitCheckUtils;
|
||
import cc.winboll.util.MainUtils;
|
||
import cc.winboll.util.ServerUtils;
|
||
import java.io.IOException;
|
||
import java.util.logging.Level;
|
||
|
||
/**
|
||
* 程序入口类,负责初始化运行环境检测与AuthCenter HTTP服务启动
|
||
* 适配Java7语言规范,兼容Android API30运行环境,支持优雅停机
|
||
* 启动参数规则:
|
||
* 1. -detail(可选,显示详细环境信息)
|
||
* 2. -v(可选,开启终端日志同步输出)
|
||
* 3. 服务器地址(可选,无-前缀,覆盖默认/INI配置)
|
||
* 4. -log:LEVEL(可选,指定日志级别,支持ALL/FINE/INFO/WARNING/SEVERE)
|
||
* 支持控制台输入交互,输入help查帮助、输入exit退出、其他指令提示未识别
|
||
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
||
* @Date 2026-01-14 00:00:00
|
||
* @LastEditTime 2026-01-26 适配邮件工具单例调用
|
||
*/
|
||
public class WinBoLL {
|
||
// ========== 静态属性(常量在前 变量在后,顺序规整) ==========
|
||
private static final String TAG = "Main";
|
||
private static AuthCenterHttpService httpService;
|
||
private static int httpPort;
|
||
|
||
// ========== 程序入口方法 ==========
|
||
public static void main(String[] args) {
|
||
LogUtils.d(TAG, "【函数调用】main(),AuthCenter程序启动,开始执行初始化流程");
|
||
MainUtils.setExit(false);
|
||
|
||
// 解析启动参数 + 加载INI根配置
|
||
/*MainUtils.parseArgs(args);
|
||
LogUtils.d(TAG, "【参数信息】main(),传入启动参数:" + MainUtils.arrayToString(args));
|
||
|
||
|
||
// 读取项目根目录 初始化日志目录
|
||
String projectRootDir = "./";
|
||
if (projectRootDir == null || projectRootDir.trim().isEmpty()) {
|
||
LogUtils.e(TAG, "INI中GlobalConfig.PROJECT_ROOT_DIR未配置,程序退出");
|
||
System.err.println("❌ 请在INI配置GlobalConfig.PROJECT_ROOT_DIR");
|
||
System.exit(1);
|
||
}
|
||
String logDir = projectRootDir.trim().replaceAll("/$", "") + "/logs";
|
||
LogUtils.setLogDir(logDir);
|
||
|
||
// 获取解析后各项参数
|
||
boolean showDetailEnv = MainUtils.parseDetailArg();
|
||
*/
|
||
|
||
String serverUrl = MainUtils.getFinalServerUrl();
|
||
httpPort = MainUtils.getHttpPortFromConfig();
|
||
LogUtils.d(TAG, "【参数信息】main(),解析后服务器地址:" + serverUrl + ",服务端口:" + httpPort);
|
||
|
||
// // 环境信息打印 + 工具类初始化
|
||
// EnvInfoUtils.printEnvReport(showDetailEnv);
|
||
// initServerUtils(serverUrl);
|
||
// // 调整:邮件工具单例初始化,增加结果判断+日志输出
|
||
// initEmailSendUtils();
|
||
//
|
||
// // 启动配置校验
|
||
// boolean initCheckPass = InitCheckUtils.checkAllInitConfig();
|
||
// if (!initCheckPass) {
|
||
// LogUtils.e(TAG, "初始化校验未通过,程序退出");
|
||
// MainUtils.setExit(true);
|
||
// System.exit(1);
|
||
// }
|
||
|
||
System.out.println("Hello World!");
|
||
|
||
// 启动HTTP服务 + 初始化控制台
|
||
startAuthCenterHttpService();
|
||
ConsoleInputUtils.initConsoleScanner();
|
||
//AdminUtils.getInstance().sendServiceStartNotify();
|
||
LogUtils.i(TAG, "HTTP服务+控制台初始化完成,服务进入常驻状态");
|
||
|
||
// 控制台阻塞监听
|
||
consoleBlockForService();
|
||
|
||
// 正常退出 释放资源
|
||
LogUtils.d(TAG, "【函数执行】main(),开始执行资源释放与停机流程");
|
||
ConsoleInputUtils.closeConsoleScanner();
|
||
//AdminUtils.getInstance().sendServiceStopNotify();
|
||
//MainUtils.releaseAllResources(httpService);
|
||
LogUtils.i(TAG, "【函数结束】main(),AuthCenter程序正常退出");
|
||
}
|
||
|
||
// ========== 私有工具方法 ==========
|
||
/**
|
||
* 初始化服务器交互工具类
|
||
*/
|
||
private static void initServerUtils(String serverUrl) {
|
||
LogUtils.d(TAG, "【函数调用】initServerUtils(),开始初始化服务器工具类");
|
||
LogUtils.d(TAG, "【参数信息】initServerUtils(),原始服务器地址:" + serverUrl);
|
||
String finalServerUrl = MainUtils.completeServerUrlProtocol(serverUrl);
|
||
ServerUtils.initServerUrl(finalServerUrl);
|
||
System.out.println("✅ ServerUtils 初始化完成,当前服务器地址:" + finalServerUrl);
|
||
LogUtils.d(TAG, "【函数结束】initServerUtils(),服务器工具类初始化就绪");
|
||
}
|
||
|
||
/**
|
||
* 调整:独立封装邮件工具初始化,适配单例,增加状态日志
|
||
*/
|
||
private static void initEmailSendUtils() {
|
||
LogUtils.d(TAG, "【函数调用】initEmailSendUtils(),开始初始化邮件发送工具");
|
||
EmailSendUtils emailUtils = EmailSendUtils.getInstance();
|
||
boolean initResult = emailUtils.initEmailConfig();
|
||
if (initResult) {
|
||
System.out.println("✅ EmailSendUtils 初始化完成,可正常发送邮件");
|
||
LogUtils.i(TAG, "邮件发送工具初始化就绪");
|
||
} else {
|
||
System.out.println("⚠️ EmailSendUtils 初始化失败,邮件相关功能不可用,请检查INI邮箱配置");
|
||
LogUtils.w(TAG, "邮件发送工具初始化失败,不影响核心服务启动");
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 启动AuthCenter HTTP服务,绑定控制台重启实例
|
||
*/
|
||
private static void startAuthCenterHttpService() {
|
||
LogUtils.d(TAG, "【函数调用】startAuthCenterHttpService(),准备启动HTTP服务,端口:" + httpPort);
|
||
httpService = new AuthCenterHttpService(httpPort);
|
||
try {
|
||
httpService.start();
|
||
ConsoleInputUtils.setHttpService(httpService);
|
||
System.out.println("\nAuthCenterHttpService 启动成功,监听端口:" + httpPort);
|
||
System.out.println("可访问接口:GET http://localhost:" + httpPort + "/authcenter/ping");
|
||
LogUtils.i(TAG, "HTTP服务启动成功,监听端口[" + httpPort + "]");
|
||
} catch (IOException e) {
|
||
String errMsg = "HTTP服务启动失败!端口 " + httpPort + " 可能被占用";
|
||
System.err.println(errMsg);
|
||
LogUtils.e(TAG, "【函数异常】startAuthCenterHttpService(),HTTP服务启动失败", e);
|
||
MainUtils.setExit(true);
|
||
ConsoleInputUtils.forceExit();
|
||
ConsoleInputUtils.closeConsoleScanner();
|
||
MainUtils.releaseAllResources(httpService);
|
||
System.exit(1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 服务常驻阻塞逻辑,低CPU占用,支持优雅退出
|
||
*/
|
||
private static void consoleBlockForService() {
|
||
LogUtils.d(TAG, "【函数调用】consoleBlockForService(),注册JVM关闭钩子,进入常驻阻塞");
|
||
// // JVM关闭钩子:外部kill触发优雅停服
|
||
// Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
||
// @Override
|
||
// public void run() {
|
||
// LogUtils.i(TAG, "收到JVM停止信号,执行服务优雅停止流程");
|
||
// ConsoleInputUtils.handleExitCmd();
|
||
// }
|
||
// }, "GracefulStop-Hook"));
|
||
|
||
System.out.println("\n服务已常驻运行,输入exit可退出服务,或执行kill 对应Java进程号停机");
|
||
while (!MainUtils.isExit()) {
|
||
try {
|
||
boolean needExit = ConsoleInputUtils.checkConsoleCommand();
|
||
if (needExit) {
|
||
MainUtils.setExit(true);
|
||
LogUtils.i(TAG, "检测到exit指令,触发服务正常停机流程");
|
||
System.exit(0);
|
||
break;
|
||
}
|
||
Thread.sleep(50);
|
||
} catch (InterruptedException e) {
|
||
LogUtils.w(TAG, "控制台监听线程被中断,触发退出");
|
||
MainUtils.setExit(true);
|
||
LogUtils.e(TAG, "【退出详情】监听线程中断,退出状态码:200(线程异常中断)");
|
||
System.exit(200);
|
||
}
|
||
}
|
||
LogUtils.d(TAG, "【函数结束】consoleBlockForService(),常驻阻塞流程退出");
|
||
}
|
||
|
||
}
|
||
|