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

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.");
}
}
}