diff --git a/src/main/java/com/fantaibao/DesktopApplication.java b/src/main/java/com/fantaibao/DesktopApplication.java index d4f222d..2d87eaa 100644 --- a/src/main/java/com/fantaibao/DesktopApplication.java +++ b/src/main/java/com/fantaibao/DesktopApplication.java @@ -1,6 +1,7 @@ package com.fantaibao; import com.fantaibao.config.GlobalConfig; +import com.fantaibao.config.PlaywrightManager; import com.fantaibao.page.InitialiNetWork; import com.fantaibao.page.LoginView; import javafx.application.Application; @@ -41,11 +42,15 @@ public class DesktopApplication extends Application { GlobalConfig.addIcon(primaryStage); // 直接启动登录界面 new LoginView(primaryStage); + // 异步加载浏览器加快启动时间 + } @Override public void stop() { closeApplicationContext(); + // 关闭Playwright实例 + PlaywrightManager.getInstance().close(); } /** @@ -60,6 +65,8 @@ public class DesktopApplication extends Application { private void handleCloseEvent(WindowEvent event) { // 关闭Spring Boot应用上下文 closeApplicationContext(); + // 关闭Playwright实例 + PlaywrightManager.getInstance().close(); // 退出JVM Platform.exit(); System.exit(0); diff --git a/src/main/java/com/fantaibao/config/BrowserConfig.java b/src/main/java/com/fantaibao/config/BrowserConfig.java deleted file mode 100644 index 1bc5ad7..0000000 --- a/src/main/java/com/fantaibao/config/BrowserConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fantaibao.config; - -import com.microsoft.playwright.Playwright; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class BrowserConfig { - - @Bean - public Playwright playwright() { - return Playwright.create(); - } - -} diff --git a/src/main/java/com/fantaibao/config/PlaywrightManager.java b/src/main/java/com/fantaibao/config/PlaywrightManager.java new file mode 100644 index 0000000..63830ff --- /dev/null +++ b/src/main/java/com/fantaibao/config/PlaywrightManager.java @@ -0,0 +1,70 @@ +package com.fantaibao.config; + +import com.microsoft.playwright.Playwright; +import lombok.extern.slf4j.Slf4j; + +/** + * Playwright单例管理类 + * 用于全局管理和提供Playwright实例 + */ +@Slf4j +public class PlaywrightManager { + + private static volatile PlaywrightManager instance; + private Playwright playwright; + + private PlaywrightManager() { + if (instance != null) { + throw new RuntimeException("请使用getInstance()方法获取实例"); + } + try { + this.playwright = Playwright.create(); + } catch (Exception e) { + log.error("创建Playwright实例失败", e); + throw new RuntimeException("创建Playwright实例失败", e); + } + } + + /** + * 获取PlaywrightManager单例实例 + * @return PlaywrightManager实例 + */ + public static PlaywrightManager getInstance() { + if (instance == null) { + synchronized (PlaywrightManager.class) { + if (instance == null) { + instance = new PlaywrightManager(); + } + } + } + return instance; + } + + /** + * 获取Playwright实例 + * @return Playwright实例 + */ + public Playwright getPlaywright() { + if (playwright == null) { + throw new RuntimeException("Playwright实例未初始化或已被销毁"); + } + return playwright; + } + + /** + * 关闭Playwright实例并释放资源 + */ + public void close() { + if (playwright != null) { + try { + playwright.close(); + } catch (Exception e) { + log.error("关闭Playwright实例时出错", e); + } finally { + playwright = null; + instance = null; + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/fantaibao/service/FtbCrawlNetDy.java b/src/main/java/com/fantaibao/service/FtbCrawlNetDy.java index b2d7680..bf7b1c0 100644 --- a/src/main/java/com/fantaibao/service/FtbCrawlNetDy.java +++ b/src/main/java/com/fantaibao/service/FtbCrawlNetDy.java @@ -2,6 +2,7 @@ package com.fantaibao.service; import com.fantaibao.base.FtbCrawlNetBase; import com.fantaibao.config.GlobalConfig; +import com.fantaibao.config.PlaywrightManager; import com.microsoft.playwright.*; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -14,13 +15,11 @@ import java.util.concurrent.atomic.AtomicBoolean; @Slf4j public class FtbCrawlNetDy extends AbstractFtbCrawlNetBase implements FtbCrawlNetBase { - @Resource - private Playwright playwright; - @Override public void executeCookieIntercept() { // 启动可见浏览器 - try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { + try (Browser browser = PlaywrightManager.getInstance().getPlaywright() + .chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { // 设置浏览器窗口大小为1920x1080 Browser.NewContextOptions contextOptions = new Browser.NewContextOptions() .setViewportSize(1680, 900); diff --git a/src/main/java/com/fantaibao/service/FtbCrawlNetMt.java b/src/main/java/com/fantaibao/service/FtbCrawlNetMt.java index fb3528e..55dbbaa 100644 --- a/src/main/java/com/fantaibao/service/FtbCrawlNetMt.java +++ b/src/main/java/com/fantaibao/service/FtbCrawlNetMt.java @@ -2,6 +2,7 @@ package com.fantaibao.service; import com.fantaibao.base.FtbCrawlNetBase; import com.fantaibao.config.GlobalConfig; +import com.fantaibao.config.PlaywrightManager; import com.microsoft.playwright.*; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -14,13 +15,11 @@ import java.util.concurrent.atomic.AtomicBoolean; @Slf4j public class FtbCrawlNetMt extends AbstractFtbCrawlNetBase implements FtbCrawlNetBase { - @Resource - private Playwright playwright; - @Override public void executeCookieIntercept() { // 启动可见浏览器 - try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { + try (Browser browser = PlaywrightManager.getInstance().getPlaywright() + .chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { // 设置浏览器窗口大小为1920x1080 Browser.NewContextOptions contextOptions = new Browser.NewContextOptions() .setViewportSize(1680, 900);