You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.9 KiB
68 lines
2.9 KiB
package com.example.datacollect;
|
|
|
|
import com.example.datacollect.controller.CrawlerController;
|
|
import com.example.datacollect.repository.ArticleRepository;
|
|
import com.example.datacollect.strategy.StrategyFactory;
|
|
import com.example.datacollect.view.ConsoleView;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
public class Main {
|
|
private static final Logger logger = LoggerFactory.getLogger(Main.class);
|
|
// 统一版本标识,与项目迭代版本对齐
|
|
private static final String CRAWLER_VERSION = "w11";
|
|
|
|
public static void main(String[] args) {
|
|
// 1. 启动时打印环境信息,便于问题排查
|
|
logger.info("=== CLI Crawler {} Starting ===", CRAWLER_VERSION);
|
|
logger.info("Java Version: {}", System.getProperty("java.version"));
|
|
logger.info("Project Group: com.example, Artifact: datacollect-cli");
|
|
|
|
// 2. 声明核心组件,便于后续关闭/清理
|
|
ConsoleView view = null;
|
|
CrawlerController controller = null;
|
|
|
|
try {
|
|
// 初始化核心组件
|
|
view = new ConsoleView();
|
|
ArticleRepository repository = new ArticleRepository();
|
|
StrategyFactory strategyFactory = new StrategyFactory();
|
|
controller = new CrawlerController(view, repository, strategyFactory);
|
|
|
|
// 3. 优化欢迎信息,版本号统一
|
|
String welcomeMsg = String.format("Welcome to CLI Crawler (%s)! Type 'help' for available commands.", CRAWLER_VERSION);
|
|
logger.info(welcomeMsg);
|
|
view.printSuccess(welcomeMsg);
|
|
|
|
// 4. 添加JVM关闭钩子,实现优雅退出(比如Ctrl+C终止时清理资源)
|
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
|
logger.info("=== CLI Crawler {} Shutting Down ===", CRAWLER_VERSION);
|
|
if (view != null) {
|
|
view.printInfo("Crawler exited gracefully.");
|
|
}
|
|
logger.info("Crawler shutdown completed.");
|
|
}));
|
|
|
|
// 核心循环:处理用户输入
|
|
while (true) {
|
|
controller.handle(view.readLine());
|
|
}
|
|
|
|
} catch (Throwable e) { // 捕获Throwable,覆盖Error和Exception,避免程序意外崩溃
|
|
logger.error("Unexpected fatal error in main loop", e);
|
|
if (view != null) {
|
|
view.printError("System fatal error: " + e.getMessage());
|
|
}
|
|
System.exit(1); // 非0退出码标识异常
|
|
|
|
} finally {
|
|
// 5. 资源清理:关闭ConsoleView中的Scanner(避免资源泄漏)
|
|
if (view != null) {
|
|
logger.debug("Closing ConsoleView resources");
|
|
// 需给ConsoleView补充close方法(见下方补充说明)
|
|
view.close();
|
|
}
|
|
logger.info("Main process exited.");
|
|
}
|
|
}
|
|
}
|