调整程序入口函数

This commit is contained in:
2026-01-18 10:35:41 +08:00
parent b0a0230734
commit 94476f39f8
2 changed files with 185 additions and 168 deletions

View File

@@ -1,175 +1,15 @@
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 17:18:36
*/
import java.util.Date;
public class Main {
// ========== 静态属性(常量在前 变量在后,顺序规整) ==========
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);
System.out.println("==== 程序启动 ====");
System.out.println("启动时间:" + new Date());
System.out.println("程序开始运行...");
// 解析启动参数 + 加载INI根配
MainUtils.parseArgs(args);
LogUtils.d(TAG, "【参数信息】main(),传入启动参数:" + MainUtils.arrayToString(args));
if (!IniConfigUtils.loadRootConfig()) {
LogUtils.e(TAG, "INI配置文件加载失败程序无法启动强制退出");
System.exit(1);
}
// 中间业务逻辑位
System.out.println("业务逻辑执行完成");
// 读取项目根目录 初始化日志目录
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);
// 设置全局日志级别
Level logLevel = MainUtils.parseLogLevelArg();
LogUtils.setGlobalLogLevel(logLevel);
LogUtils.i(TAG, "全局日志级别已设置:" + logLevel.getName());
LogUtils.i(TAG, "日志目录已配置,路径:" + logDir);
// 获取解析后各项参数
boolean isVerbose = MainUtils.isVerbose();
boolean showDetailEnv = MainUtils.parseDetailArg();
String serverUrl = MainUtils.getFinalServerUrl();
httpPort = MainUtils.getHttpPortFromConfig();
LogUtils.i(TAG, "终端日志同步输出状态:" + (isVerbose ? "✅ 开启" : "❌ 关闭"));
LogUtils.d(TAG, "【参数信息】main(),解析后服务器地址:" + serverUrl + ",服务端口:" + httpPort);
// 环境信息打印 + 工具类初始化
EnvInfoUtils.printEnvReport(showDetailEnv);
initServerUtils(serverUrl);
EmailSendUtils.initEmailConfig();
// 启动配置校验
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程序正常退出");
System.out.println("\n==== 程序结束 ====");
System.out.println("结束时间:" + new Date());
}
// ========== 私有工具方法 ==========
/**
* 初始化服务器交互工具类
*/
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(),服务器工具类初始化就绪");
}
/**
* 启动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(),常驻阻塞流程退出");
}
}

177
src/cc/winboll/WinBoLL.java Normal file
View File

@@ -0,0 +1,177 @@
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 17:18:36
*/
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));
if (!IniConfigUtils.loadRootConfig()) {
LogUtils.e(TAG, "INI配置文件加载失败程序无法启动强制退出");
System.exit(1);
}
// 读取项目根目录 初始化日志目录
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);
// 设置全局日志级别
Level logLevel = MainUtils.parseLogLevelArg();
LogUtils.setGlobalLogLevel(logLevel);
LogUtils.i(TAG, "全局日志级别已设置:" + logLevel.getName());
LogUtils.i(TAG, "日志目录已配置,路径:" + logDir);
// 获取解析后各项参数
boolean isVerbose = MainUtils.isVerbose();
boolean showDetailEnv = MainUtils.parseDetailArg();
String serverUrl = MainUtils.getFinalServerUrl();
httpPort = MainUtils.getHttpPortFromConfig();
LogUtils.i(TAG, "终端日志同步输出状态:" + (isVerbose ? "✅ 开启" : "❌ 关闭"));
LogUtils.d(TAG, "【参数信息】main(),解析后服务器地址:" + serverUrl + ",服务端口:" + httpPort);
// 环境信息打印 + 工具类初始化
EnvInfoUtils.printEnvReport(showDetailEnv);
initServerUtils(serverUrl);
EmailSendUtils.initEmailConfig();
// 启动配置校验
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(),服务器工具类初始化就绪");
}
/**
* 启动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(),常驻阻塞流程退出");
}
}