Files
AuthCenterConsoleApp/src/cc/winboll/WinBoLL.java

186 lines
8.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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(),常驻阻塞流程退出");
}
}