调整程序入口函数
This commit is contained in:
176
src/Main.java
176
src/Main.java
@@ -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
177
src/cc/winboll/WinBoLL.java
Normal 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(),常驻阻塞流程退出");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user