重构Main类

This commit is contained in:
2026-01-16 13:14:44 +08:00
parent 47fce9bc19
commit e01a026c7a
3 changed files with 283 additions and 295 deletions

View File

@@ -1,295 +0,0 @@
import cc.winboll.LogUtils;
import cc.winboll.auth.MailAuthUtils;
import cc.winboll.service.AuthCenterHttpService;
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.ServerUtils;
import java.io.IOException;
/**
* 程序入口类负责初始化运行环境检测与AuthCenter HTTP服务启动
* 适配Java7语言规范兼容Android API30运行环境支持优雅停机
* 启动参数规则1. -detail(可选,显示详细环境信息) 2. 服务器地址(可选,覆盖默认/INI配置)
* 支持控制台输入交互输入help查帮助、输入exit退出、其他指令提示未识别
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/14 00:00:00
* @LastEditTime 2026/01/18 10:00:00
*/
public class Main {
// 全局静态属性(常量→变量,顺序清晰)
private static final String TAG = "AuthCenterMain";
private static final String DEFAULT_SERVER_URL = "http://localhost:8080";
private static final String ARG_DETAIL = "-detail";
private static final String INI_SERVER_SECTION = "ServerConfig";
private static final String INI_SERVER_KEY = "server_base_url";
// 新增HTTP端口配置项读取INI适配灵活性
private static final String INI_HTTP_SECTION = "HttpServiceConfig";
private static final String INI_HTTP_PORT_KEY = "http_server_port";
private static final int DEFAULT_HTTP_PORT = 8080;
private static AuthCenterHttpService httpService;
private static int httpPort; // 全局HTTP端口变量
/**
* 程序主入口方法,统一调度初始化、服务启动、常驻阻塞全流程
* @param args 启动参数,支持-detail详细环境、自定义服务器地址
*/
public static void main(String[] args) {
IniConfigUtils.loadRootConfig();
LogUtils.d(TAG, "【函数调用】main(),传入参数:" + arrayToString(args));
boolean showDetailEnv = parseDetailArg(args);
String serverUrl = getFinalServerUrl(args);
httpPort = getHttpPortFromConfig(); // 新增读取HTTP端口配置
EnvInfoUtils.printEnvReport(showDetailEnv);
initServerUtils(serverUrl);
// 新增:先初始化邮件配置,保障邮件校验能读取到完整配置
EmailSendUtils.initEmailConfig();
// 启动初始化校验(邮件+服务器)
boolean initCheckPass = InitCheckUtils.checkAllInitConfig();
if (!initCheckPass) {
System.exit(1);
}
System.out.println("Hello World!");
startAuthCenterHttpService();
ConsoleInputUtils.initConsoleScanner();
consoleBlockForService();
releaseAllResources();
LogUtils.i(TAG, "【函数结束】main(),程序正常退出");
}
/**
* 新增从INI读取HTTP端口无配置兜底默认8080
*/
private static int getHttpPortFromConfig() {
LogUtils.d(TAG, "【函数调用】getHttpPortFromConfig()读取HTTP服务端口配置");
String portStr = IniConfigUtils.getConfigValue(INI_HTTP_SECTION, INI_HTTP_PORT_KEY);
if (portStr == null || portStr.trim().isEmpty()) {
LogUtils.i(TAG, "未读取到HTTP端口配置使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
try {
int port = Integer.parseInt(portStr.trim());
if (port > 0 && port <= 65535) {
LogUtils.i(TAG, "从INI读取HTTP端口成功" + port);
return port;
} else {
LogUtils.w(TAG, "HTTP端口配置非法使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
} catch (Exception e) {
LogUtils.w(TAG, "HTTP端口配置解析失败使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
}
/**
* 解析启动参数,判断是否输出详细环境信息
* @param args 启动参数数组
* @return true=显示详细信息false=显示精简信息
*/
private static boolean parseDetailArg(String[] args) {
LogUtils.d(TAG, "【函数调用】parseDetailArg()入参args" + arrayToString(args));
if (args == null || args.length == 0) {
LogUtils.d(TAG, "【函数返回】parseDetailArg()无启动参数返回false");
return false;
}
for (String arg : args) {
String trimArg = arg.trim();
if (ARG_DETAIL.equalsIgnoreCase(trimArg)) {
LogUtils.i(TAG, "【参数检测】匹配-detail参数将输出详细环境信息");
LogUtils.d(TAG, "【函数返回】parseDetailArg()匹配参数成功返回true");
return true;
}
}
LogUtils.d(TAG, "【函数返回】parseDetailArg(),未匹配-detail参数返回false");
return false;
}
/**
* 整合多来源服务器地址,优先级 启动参数 > INI配置 > 默认地址适配config.ini
* @param args 启动参数数组
* @return 最终生效的服务器地址
*/
private static String getFinalServerUrl(String[] args) {
LogUtils.d(TAG, "【函数调用】getFinalServerUrl(),整合服务器地址(启动参数>INI>默认)");
String argUrl = parseServerUrlArg(args);
if (argUrl != null && !argUrl.trim().isEmpty()) {
LogUtils.i(TAG, "服务器地址优先级1启动参数 → " + argUrl);
return argUrl;
}
String iniUrl = IniConfigUtils.getConfigValue(INI_SERVER_SECTION, INI_SERVER_KEY);
if (iniUrl != null && !iniUrl.trim().isEmpty()) {
LogUtils.i(TAG, "服务器地址优先级2INI配置 → " + iniUrl);
return iniUrl;
}
LogUtils.i(TAG, "服务器地址优先级3默认地址 → " + DEFAULT_SERVER_URL);
return DEFAULT_SERVER_URL;
}
/**
* 从启动参数提取自定义服务器地址,非-detail参数均视为服务器地址
* @param args 启动参数数组
* @return 解析到的地址无则返回null
*/
private static String parseServerUrlArg(String[] args) {
LogUtils.d(TAG, "【函数调用】parseServerUrlArg()入参args" + arrayToString(args));
if (args == null || args.length == 0) {
LogUtils.d(TAG, "【函数返回】无启动参数返回null");
return null;
}
for (String arg : args) {
String trimArg = arg.trim();
if (!ARG_DETAIL.equalsIgnoreCase(trimArg) && !trimArg.isEmpty()) {
LogUtils.i(TAG, "【参数检测】匹配自定义服务器地址,覆盖默认值:" + trimArg);
LogUtils.d(TAG, "【函数返回】解析到地址,返回:" + trimArg);
return trimArg;
}
}
LogUtils.d(TAG, "【函数返回】未解析到自定义地址返回null");
return null;
}
/**
* 初始化服务器交互工具类自动补全HTTP协议头保障地址有效性
* @param serverUrl 初始服务器地址(可无协议头)
*/
private static void initServerUtils(String serverUrl) {
LogUtils.d(TAG, "【函数调用】initServerUtils(),入参初始服务器地址:" + serverUrl);
String finalServerUrl = completeServerUrlProtocol(serverUrl);
ServerUtils.initServerUrl(finalServerUrl);
System.out.println("✅ ServerUtils 初始化完成,当前服务器地址:" + finalServerUrl);
LogUtils.d(TAG, "【函数结束】initServerUtils(),服务器交互工具初始化就绪");
}
/**
* 补全服务器地址HTTP/HTTPS协议头避免无效地址提升兼容性
* @param url 原始服务器地址
* @return 补全协议头后的合法地址
*/
private static String completeServerUrlProtocol(String url) {
LogUtils.d(TAG, "【函数调用】completeServerUrlProtocol(),入参原始地址:" + url);
if (url == null || url.trim().isEmpty()) {
LogUtils.w(TAG, "原始地址为空,使用默认服务器地址:" + DEFAULT_SERVER_URL);
LogUtils.d(TAG, "【函数返回】completeServerUrlProtocol(),返回默认地址:" + DEFAULT_SERVER_URL);
return DEFAULT_SERVER_URL;
}
String trimUrl = url.trim();
if (trimUrl.startsWith("http://") || trimUrl.startsWith("https://")) {
LogUtils.d(TAG, "【函数返回】completeServerUrlProtocol(),地址协议头完整,返回原地址:" + trimUrl);
return trimUrl;
}
String newUrl = "http://" + trimUrl;
LogUtils.w(TAG, "服务器地址协议头缺失,自动补全为:" + newUrl);
LogUtils.d(TAG, "【函数返回】completeServerUrlProtocol(),补全协议头后返回:" + newUrl);
return newUrl;
}
/**
* 初始化并启动AuthCenter HTTP服务绑定配置端口监听异常则退出程序
*/
private static void startAuthCenterHttpService() {
LogUtils.d(TAG, "【函数调用】startAuthCenterHttpService()开始启动HTTP服务");
httpService = new AuthCenterHttpService(httpPort);
try {
httpService.start();
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);
ConsoleInputUtils.forceExit();
releaseAllResources();
System.exit(1);
}
LogUtils.d(TAG, "【函数结束】startAuthCenterHttpService()HTTP服务启动流程执行完成");
}
/**
* 服务常驻阻塞逻辑注册JVM关闭钩子实现优雅停机调用工具类监听输入
*/
private static void consoleBlockForService() {
LogUtils.d(TAG, "【函数调用】consoleBlockForService(),开始注册关闭钩子与常驻阻塞");
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
LogUtils.i(TAG, "收到服务停止信号,执行优雅停机流程");
ConsoleInputUtils.forceExit();
ConsoleInputUtils.closeConsoleScanner();
if (httpService != null && httpService.isRunning()) {
httpService.stop();
LogUtils.i(TAG, "HTTP服务已优雅停止");
}
}
}));
System.out.println("\n服务已常驻运行输入exit可退出服务或执行kill 对应Java进程号停机");
while (true) {
try {
if (ConsoleInputUtils.isExit() || ConsoleInputUtils.checkConsoleCommand()) {
break;
}
Thread.sleep(500);
} catch (InterruptedException e) {
LogUtils.w(TAG, "【阻塞中断】服务阻塞线程被中断,准备退出循环", e);
ConsoleInputUtils.forceExit();
ConsoleInputUtils.closeConsoleScanner();
Thread.currentThread().interrupt();
break;
}
}
LogUtils.d(TAG, "【函数结束】consoleBlockForService(),常驻阻塞流程退出");
}
/**
* 兜底释放所有资源,适配加固后工具类,形成退出闭环
*/
private static void releaseAllResources() {
LogUtils.d(TAG, "【函数调用】releaseAllResources(),兜底释放所有服务资源");
if (httpService != null && httpService.isRunning()) {
httpService.stop();
LogUtils.i(TAG, "HTTP服务兜底停止完成");
}
ConsoleInputUtils.closeConsoleScanner();
MailAuthUtils.getInstance().shutdownScheduler();
LogUtils.d(TAG, "【函数结束】releaseAllResources(),所有资源释放完成");
}
/**
* 数组转字符串Java7兼容替代String.join适配参数日志输出
* @param arr 目标字符串数组
* @return 拼接后的字符串,空数组返回"空数组"
*/
private static String arrayToString(String[] arr) {
if (arr == null || arr.length == 0) {
return "空数组";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i != arr.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
}

126
src/cc/winboll/Main.java Normal file
View File

@@ -0,0 +1,126 @@
package cc.winboll;
import cc.winboll.LogUtils;
import cc.winboll.auth.MailAuthUtils;
import cc.winboll.service.AuthCenterHttpService;
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;
/**
* 程序入口类负责初始化运行环境检测与AuthCenter HTTP服务启动
* 适配Java7语言规范兼容Android API30运行环境支持优雅停机
* 启动参数规则1. -detail(可选,显示详细环境信息) 2. 服务器地址(可选,覆盖默认/INI配置)
* 支持控制台输入交互输入help查帮助、输入exit退出、其他指令提示未识别
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/14 00:00:00
* @LastEditTime 2026/01/18 11:00:00
*/
public class Main {
private static final String TAG = "AuthCenterMain";
private static AuthCenterHttpService httpService;
private static int httpPort;
public static void main(String[] args) {
IniConfigUtils.loadRootConfig();
LogUtils.d(TAG, "【函数调用】main(),传入参数:" + MainUtils.arrayToString(args));
boolean showDetailEnv = MainUtils.parseDetailArg(args);
String serverUrl = MainUtils.getFinalServerUrl(args);
httpPort = MainUtils.getHttpPortFromConfig();
EnvInfoUtils.printEnvReport(showDetailEnv);
initServerUtils(serverUrl);
EmailSendUtils.initEmailConfig();
boolean initCheckPass = InitCheckUtils.checkAllInitConfig();
if (!initCheckPass) {
System.exit(1);
}
System.out.println("Hello World!");
startAuthCenterHttpService();
ConsoleInputUtils.initConsoleScanner();
consoleBlockForService();
MainUtils.releaseAllResources(httpService);
LogUtils.i(TAG, "【函数结束】main(),程序正常退出");
}
/**
* 初始化服务器交互工具类
*/
private static void initServerUtils(String serverUrl) {
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服务");
httpService = new AuthCenterHttpService(httpPort);
try {
httpService.start();
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);
ConsoleInputUtils.forceExit();
MainUtils.releaseAllResources(httpService);
System.exit(1);
}
}
/**
* 服务常驻阻塞逻辑
*/
private static void consoleBlockForService() {
LogUtils.d(TAG, "【函数调用】consoleBlockForService(),开始注册关闭钩子与常驻阻塞");
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
LogUtils.i(TAG, "收到服务停止信号,执行优雅停机流程");
ConsoleInputUtils.forceExit();
ConsoleInputUtils.closeConsoleScanner();
if (httpService != null && httpService.isRunning()) {
httpService.stop();
LogUtils.i(TAG, "HTTP服务已优雅停止");
}
}
}));
System.out.println("\n服务已常驻运行输入exit可退出服务或执行kill 对应Java进程号停机");
while (true) {
try {
if (ConsoleInputUtils.isExit() || ConsoleInputUtils.checkConsoleCommand()) {
break;
}
Thread.sleep(500);
} catch (InterruptedException e) {
LogUtils.w(TAG, "【阻塞中断】服务阻塞线程被中断,准备退出循环", e);
ConsoleInputUtils.forceExit();
ConsoleInputUtils.closeConsoleScanner();
Thread.currentThread().interrupt();
break;
}
}
LogUtils.d(TAG, "【函数结束】consoleBlockForService(),常驻阻塞流程退出");
}
}

View File

@@ -0,0 +1,157 @@
package cc.winboll.util;
import cc.winboll.LogUtils;
import cc.winboll.auth.MailAuthUtils;
import cc.winboll.service.AuthCenterHttpService;
/**
* Main类通用工具抽离负责参数解析、地址处理、资源释放
* 适配Java7 + Android API30无状态设计纯静态方法
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/18 11:00:00
*/
public class MainUtils {
// 常量迁移:与业务无关的通用常量
public static final String ARG_DETAIL = "-detail";
public static final String INI_SERVER_SECTION = "ServerConfig";
public static final String INI_SERVER_KEY = "server_base_url";
public static final String INI_HTTP_SECTION = "HttpServiceConfig";
public static final String INI_HTTP_PORT_KEY = "http_server_port";
public static final int DEFAULT_HTTP_PORT = 8080;
public static final String DEFAULT_SERVER_URL = "http://localhost:8080";
private static final String TAG = "MainUtils";
/**
* 解析启动参数,判断是否输出详细环境信息
*/
public static boolean parseDetailArg(String[] args) {
LogUtils.d(TAG, "【函数调用】parseDetailArg()入参args" + arrayToString(args));
if (args == null || args.length == 0) {
return false;
}
for (String arg : args) {
String trimArg = arg.trim();
if (ARG_DETAIL.equalsIgnoreCase(trimArg)) {
LogUtils.i(TAG, "【参数检测】匹配-detail参数将输出详细环境信息");
return true;
}
}
return false;
}
/**
* 整合多来源服务器地址,优先级 启动参数 > INI配置 > 默认地址
*/
public static String getFinalServerUrl(String[] args) {
LogUtils.d(TAG, "【函数调用】getFinalServerUrl(),整合服务器地址(启动参数>INI>默认)");
String argUrl = parseServerUrlArg(args);
if (argUrl != null && !argUrl.trim().isEmpty()) {
LogUtils.i(TAG, "服务器地址优先级1启动参数 → " + argUrl);
return argUrl;
}
String iniUrl = IniConfigUtils.getConfigValue(INI_SERVER_SECTION, INI_SERVER_KEY);
if (iniUrl != null && !iniUrl.trim().isEmpty()) {
LogUtils.i(TAG, "服务器地址优先级2INI配置 → " + iniUrl);
return iniUrl;
}
LogUtils.i(TAG, "服务器地址优先级3默认地址 → " + DEFAULT_SERVER_URL);
return DEFAULT_SERVER_URL;
}
/**
* 从启动参数提取自定义服务器地址
*/
private static String parseServerUrlArg(String[] args) {
LogUtils.d(TAG, "【函数调用】parseServerUrlArg()入参args" + arrayToString(args));
if (args == null || args.length == 0) {
return null;
}
for (String arg : args) {
String trimArg = arg.trim();
if (!ARG_DETAIL.equalsIgnoreCase(trimArg) && !trimArg.isEmpty()) {
LogUtils.i(TAG, "【参数检测】匹配自定义服务器地址,覆盖默认值:" + trimArg);
return trimArg;
}
}
return null;
}
/**
* 补全服务器地址HTTP/HTTPS协议头
*/
public static String completeServerUrlProtocol(String url) {
LogUtils.d(TAG, "【函数调用】completeServerUrlProtocol(),入参原始地址:" + url);
if (url == null || url.trim().isEmpty()) {
LogUtils.w(TAG, "原始地址为空,使用默认服务器地址:" + DEFAULT_SERVER_URL);
return DEFAULT_SERVER_URL;
}
String trimUrl = url.trim();
if (trimUrl.startsWith("http://") || trimUrl.startsWith("https://")) {
return trimUrl;
}
String newUrl = "http://" + trimUrl;
LogUtils.w(TAG, "服务器地址协议头缺失,自动补全为:" + newUrl);
return newUrl;
}
/**
* 从INI读取HTTP端口无配置兜底默认值
*/
public static int getHttpPortFromConfig() {
LogUtils.d(TAG, "【函数调用】getHttpPortFromConfig()读取HTTP服务端口配置");
String portStr = IniConfigUtils.getConfigValue(INI_HTTP_SECTION, INI_HTTP_PORT_KEY);
if (portStr == null || portStr.trim().isEmpty()) {
LogUtils.i(TAG, "未读取到HTTP端口配置使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
try {
int port = Integer.parseInt(portStr.trim());
if (port > 0 && port <= 65535) {
LogUtils.i(TAG, "从INI读取HTTP端口成功" + port);
return port;
} else {
LogUtils.w(TAG, "HTTP端口配置非法使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
} catch (Exception e) {
LogUtils.w(TAG, "HTTP端口配置解析失败使用默认端口" + DEFAULT_HTTP_PORT);
return DEFAULT_HTTP_PORT;
}
}
/**
* 统一资源释放逻辑
*/
public static void releaseAllResources(AuthCenterHttpService httpService) {
LogUtils.d(TAG, "【函数调用】releaseAllResources(),兜底释放所有服务资源");
if (httpService != null && httpService.isRunning()) {
httpService.stop();
LogUtils.i(TAG, "HTTP服务兜底停止完成");
}
ConsoleInputUtils.closeConsoleScanner();
MailAuthUtils.getInstance().shutdownScheduler();
LogUtils.d(TAG, "【函数结束】releaseAllResources(),所有资源释放完成");
}
/**
* 数组转字符串Java7兼容替代String.join
*/
public static String arrayToString(String[] arr) {
if (arr == null || arr.length == 0) {
return "空数组";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i != arr.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
}