From 5a1a12180bcd8dea74198fd480598dd8b1550cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Tue, 17 Oct 2023 15:00:07 +0800 Subject: [PATCH 01/10] =?UTF-8?q?+=20=E4=BC=98=E5=8C=96=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/light/GitManagerApp.java | 2 +- .../java/com/light/component/NoticePane.java | 10 ++++---- .../light/util/FxApplicationContextUtils.java | 2 +- src/main/java/com/light/util/FxUtil.java | 24 ++++++++++++++++++- src/main/java/com/light/util/JGitUtils.java | 9 ++++--- src/main/java/com/light/view/ManagerView.java | 2 +- .../java/com/light/view/NotificationView.java | 3 ++- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/light/GitManagerApp.java b/src/main/java/com/light/GitManagerApp.java index c6df68b..daa207f 100644 --- a/src/main/java/com/light/GitManagerApp.java +++ b/src/main/java/com/light/GitManagerApp.java @@ -32,7 +32,7 @@ public class GitManagerApp extends Application { super.init(); AsyncTask.runOnce("初始化数据库和主题数据", () -> { String gitDbInit = H2PoolUtils.queryDictByLabel("GIT_DB_INIT", "0"); - if ("1".equals(gitDbInit)) { + if ("0".equals(gitDbInit)) { H2PoolUtils.createTable(); H2PoolUtils.initGitProjectDictData(); } diff --git a/src/main/java/com/light/component/NoticePane.java b/src/main/java/com/light/component/NoticePane.java index 25bfa3a..02115ac 100644 --- a/src/main/java/com/light/component/NoticePane.java +++ b/src/main/java/com/light/component/NoticePane.java @@ -7,18 +7,18 @@ import javafx.scene.layout.HBox; public class NoticePane extends ModalDialog { - public NoticePane(String title, ObservableList list) { + public NoticePane(String title, ObservableList list) { super(); header.setTitle(title); content.setBody(createContent(list)); content.setFooter(null); } - private HBox createContent(ObservableList list) { - ListView listView = new ListView<>(list); + private HBox createContent(ObservableList list) { + ListView listView = new ListView<>(list); listView.getStyleClass().add("du-list"); - listView.setMaxWidth(800); - listView.setMinWidth(550); + listView.setMaxWidth(600); + listView.setMinWidth(600); return new HBox(listView); } diff --git a/src/main/java/com/light/util/FxApplicationContextUtils.java b/src/main/java/com/light/util/FxApplicationContextUtils.java index 0ff48b6..02e16f6 100644 --- a/src/main/java/com/light/util/FxApplicationContextUtils.java +++ b/src/main/java/com/light/util/FxApplicationContextUtils.java @@ -54,5 +54,5 @@ public final class FxApplicationContextUtils { /** * 历史通知集合 */ - public static final ObservableList HISTORY_NOTICE_LIST = FXCollections.observableArrayList(); + public static final ObservableList HISTORY_NOTICE_LIST = FXCollections.observableArrayList(); } diff --git a/src/main/java/com/light/util/FxUtil.java b/src/main/java/com/light/util/FxUtil.java index db43480..1ac3cf3 100644 --- a/src/main/java/com/light/util/FxUtil.java +++ b/src/main/java/com/light/util/FxUtil.java @@ -1,18 +1,27 @@ package com.light.util; +import atlantafx.base.theme.Styles; +import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.geometry.Bounds; import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; +import javafx.scene.control.Button; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.stage.Window; +import org.kordamp.ikonli.bootstrapicons.BootstrapIcons; +import org.kordamp.ikonli.javafx.FontIcon; import java.util.Objects; import java.util.concurrent.Callable; @@ -166,6 +175,19 @@ public class FxUtil { * @param message */ public static void addNoticeList(String message) { - FxApplicationContextUtils.HISTORY_NOTICE_LIST.add(0, message); + if (message.length() > 100) { + message = message.substring(0, 100); + } + Text text = new Text(message); + text.setWrappingWidth(500d); + Button removeButton = new Button(null, new FontIcon(BootstrapIcons.X)); + removeButton.getStyleClass().addAll(Styles.BUTTON_ICON, Styles.FLAT, Styles.ACCENT); + HBox hBox = new HBox(10, text, removeButton); + hBox.setAlignment(Pos.CENTER); + HBox.setHgrow(text, Priority.ALWAYS); + removeButton.setOnMouseClicked(event -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.remove(hBox)); + Platform.runLater(() -> { + FxApplicationContextUtils.HISTORY_NOTICE_LIST.add(0, hBox); + }); } } diff --git a/src/main/java/com/light/util/JGitUtils.java b/src/main/java/com/light/util/JGitUtils.java index 7602c05..a30b5e4 100644 --- a/src/main/java/com/light/util/JGitUtils.java +++ b/src/main/java/com/light/util/JGitUtils.java @@ -6,7 +6,6 @@ import com.light.exception.JGitException; import com.light.exception.TimeOutException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; -import javafx.application.Platform; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; @@ -183,7 +182,7 @@ public class JGitUtils { // 插入之前验证是否已经存在 if (H2PoolUtils.existsGitProjects(newProject)) { LOGGER.warn("项目 {},作者 {} 已经存在,不再新增", name, author); - Platform.runLater(() -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.add("项目 " + name + ",作者 " + author + " 已经存在,不再新增")); + FxUtil.addNoticeList("项目 " + name + ",作者 " + author + " 已经存在,不再新增"); newProject = null; } else { // 不存在则继续新增,并设置id @@ -192,7 +191,7 @@ public class JGitUtils { } } catch (Exception e) { LOGGER.error("本地项目 {} 解析失败:{}", path.getAbsolutePath(), e.getMessage()); - Platform.runLater(() -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.add("本地项目 " + path.getAbsolutePath() + " 解析失败:" + e.getMessage())); + FxUtil.addNoticeList("本地项目 " + path.getAbsolutePath() + " 解析失败:" + e.getMessage()); } }); @@ -208,7 +207,7 @@ public class JGitUtils { } catch (Exception e) { String message = e.getMessage(); LOGGER.error("项目 {} 克隆异常:{}", remoteUrl, message); - Platform.runLater(() -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.add("项目 " + remoteUrl + " 克隆异常:" + message)); + FxUtil.addNoticeList("项目 " + remoteUrl + " 克隆异常:" + message); if (message.contains("authorized") || message.contains("Authentication")) { // 权限异常 throw new AuthException(); @@ -233,7 +232,7 @@ public class JGitUtils { } catch (Exception e) { String message = e.getMessage(); LOGGER.error("项目 {} 更新异常:{}", remoteUrl, message); - Platform.runLater(() -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.add("项目 " + remoteUrl + " 更新异常:" + message)); + FxUtil.addNoticeList("项目 " + remoteUrl + " 更新异常:" + message); if ("Github".equals(getType(remoteUrl))) { GITHUB_FAIL_NUMBER.incrementAndGet(); } diff --git a/src/main/java/com/light/view/ManagerView.java b/src/main/java/com/light/view/ManagerView.java index 2f5596d..1368d2c 100644 --- a/src/main/java/com/light/view/ManagerView.java +++ b/src/main/java/com/light/view/ManagerView.java @@ -213,7 +213,7 @@ public class ManagerView extends StackPane { LOGGER.error("项目更新异常:{}", e.getMessage()); } // 更新更新数量-1 - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + Platform.runLater(() -> FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet()))); }); updateButton.setDisable(false); })); diff --git a/src/main/java/com/light/view/NotificationView.java b/src/main/java/com/light/view/NotificationView.java index af09622..7b203a0 100644 --- a/src/main/java/com/light/view/NotificationView.java +++ b/src/main/java/com/light/view/NotificationView.java @@ -3,12 +3,13 @@ package com.light.view; import atlantafx.base.theme.Styles; import com.light.util.FxApplicationContextUtils; import javafx.collections.ListChangeListener; +import javafx.scene.layout.HBox; import javafx.scene.text.Text; public class NotificationView extends Text { public NotificationView() { super(FxApplicationContextUtils.HISTORY_NOTICE_LIST.size() + ""); getStyleClass().addAll(Styles.TEXT, Styles.WARNING); - FxApplicationContextUtils.HISTORY_NOTICE_LIST.addListener((ListChangeListener) c -> setText(FxApplicationContextUtils.HISTORY_NOTICE_LIST.size() + "")); + FxApplicationContextUtils.HISTORY_NOTICE_LIST.addListener((ListChangeListener) c -> setText(FxApplicationContextUtils.HISTORY_NOTICE_LIST.size() + "")); } } -- Gitee From 2ef04434bf84e023946fa381fc51e5cefd6094db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Tue, 17 Oct 2023 16:26:20 +0800 Subject: [PATCH 02/10] =?UTF-8?q?+=20=E5=90=AF=E5=8A=A8=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/com/light/GitManagerApp.java | 66 ++++++----- .../com/light/component/DownloadHBox.java | 99 +++++++++-------- .../com/light/component/LevelTableCell.java | 18 ++- .../light/component/OperationTableCell.java | 75 +++++++++++-- .../java/com/light/theme/ThemeDialog.java | 18 ++- .../java/com/light/thread/AsyncEvent.java | 4 + src/main/java/com/light/thread/AsyncTask.java | 23 ++-- .../java/com/light/thread/GitThreadPool.java | 4 + src/main/java/com/light/view/ManagerView.java | 104 +++++++++--------- 10 files changed, 267 insertions(+), 146 deletions(-) diff --git a/pom.xml b/pom.xml index 0843f06..0b3db6d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.light GitManagerClientFx - 1.0 + 2.0 21 diff --git a/src/main/java/com/light/GitManagerApp.java b/src/main/java/com/light/GitManagerApp.java index daa207f..85d9a73 100644 --- a/src/main/java/com/light/GitManagerApp.java +++ b/src/main/java/com/light/GitManagerApp.java @@ -4,6 +4,7 @@ import atlantafx.base.controls.ModalPane; import atlantafx.base.theme.*; import com.light.layout.ContentPane; import com.light.layout.MenuPane; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; import com.light.thread.GitThreadPool; import com.light.util.FxApplicationContextUtils; @@ -30,33 +31,48 @@ public class GitManagerApp extends Application { public void init() throws Exception { startTime = System.currentTimeMillis(); super.init(); - AsyncTask.runOnce("初始化数据库和主题数据", () -> { - String gitDbInit = H2PoolUtils.queryDictByLabel("GIT_DB_INIT", "0"); - if ("0".equals(gitDbInit)) { - H2PoolUtils.createTable(); - H2PoolUtils.initGitProjectDictData(); + AsyncTask.runOnce("初始化数据库和主题数据", new AsyncEvent() { + + private String themeName = "Primer Light"; + + @Override + public void handler() throws Exception { + String gitDbInit = H2PoolUtils.queryDictByLabel("GIT_DB_INIT", "0"); + if ("0".equals(gitDbInit)) { + H2PoolUtils.createTable(); + H2PoolUtils.initGitProjectDictData(); + } + + FxApplicationContextUtils.THEME_LIST.add(new PrimerLight()); + FxApplicationContextUtils.THEME_LIST.add(new PrimerDark()); + FxApplicationContextUtils.THEME_LIST.add(new NordLight()); + FxApplicationContextUtils.THEME_LIST.add(new NordDark()); + FxApplicationContextUtils.THEME_LIST.add(new CupertinoLight()); + FxApplicationContextUtils.THEME_LIST.add(new CupertinoDark()); + FxApplicationContextUtils.THEME_LIST.add(new Dracula()); + + // 设置主题 + themeName = H2PoolUtils.queryDictByLabel("GIT_CURRENT_THEME", "Primer Light"); } - FxApplicationContextUtils.THEME_LIST.add(new PrimerLight()); - FxApplicationContextUtils.THEME_LIST.add(new PrimerDark()); - FxApplicationContextUtils.THEME_LIST.add(new NordLight()); - FxApplicationContextUtils.THEME_LIST.add(new NordDark()); - FxApplicationContextUtils.THEME_LIST.add(new CupertinoLight()); - FxApplicationContextUtils.THEME_LIST.add(new CupertinoDark()); - FxApplicationContextUtils.THEME_LIST.add(new Dracula()); - - // 设置主题 - String themeName = H2PoolUtils.queryDictByLabel("GIT_CURRENT_THEME", "Primer Light"); - FxApplicationContextUtils.CURRENT_THEME_NAME.set(themeName); - FxApplicationContextUtils.THEME_LIST.stream() - .filter(theme -> theme.getName().equals(themeName)) - .findFirst() - .ifPresentOrElse(theme -> Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()), - () -> Application.setUserAgentStylesheet(FxApplicationContextUtils.THEME_LIST.getFirst().getUserAgentStylesheet()) - ); - - // 查询所有项目数据 - H2PoolUtils.queryGitProjects(); + @Override + public void success() { + FxApplicationContextUtils.CURRENT_THEME_NAME.set(themeName); + FxApplicationContextUtils.THEME_LIST.stream() + .filter(theme -> theme.getName().equals(themeName)) + .findFirst() + .ifPresentOrElse(theme -> Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()), + () -> Application.setUserAgentStylesheet(FxApplicationContextUtils.THEME_LIST.getFirst().getUserAgentStylesheet()) + ); + + // 查询所有项目数据 + H2PoolUtils.queryGitProjects(); + } + + @Override + public void fail() { + + } }); } diff --git a/src/main/java/com/light/component/DownloadHBox.java b/src/main/java/com/light/component/DownloadHBox.java index c4e2610..df8cf71 100644 --- a/src/main/java/com/light/component/DownloadHBox.java +++ b/src/main/java/com/light/component/DownloadHBox.java @@ -2,16 +2,14 @@ package com.light.component; import atlantafx.base.theme.Styles; import com.light.exception.AuthException; -import com.light.exception.JGitException; -import com.light.exception.TimeOutException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; import com.light.util.JGitUtils; -import javafx.application.Platform; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; @@ -95,50 +93,65 @@ public class DownloadHBox extends HBox { */ public void cloneRepo(CredentialsProvider provider, boolean retry) { this.provider = provider; - AsyncTask.runOnce("克隆项目", () -> { - if (retry) { - deleteFiles(localRepoFile); - retryButton.setVisible(false); + AsyncTask.runOnce("克隆项目", new AsyncEvent() { + + private GitProject newProject; + private AuthenticationPane authPane; + + @Override + public void handler() throws Exception { + + if (retry) { + deleteFiles(localRepoFile); + retryButton.setVisible(false); + } + + try { + authPane = null; + // 开始下载 + String branch = JGitUtils.cloneRepo(remoteUrl, localRepoFile, provider, customProgressMonitor); + // 下载完成入库 + String name = getRepoName(remoteUrl); + String author = getAuthor(remoteUrl); + String local = localRepoFile.getAbsolutePath(); + newProject = new GitProject(new SimpleIntegerProperty(0), + new SimpleStringProperty(name), + new SimpleStringProperty(author), + new SimpleStringProperty(branch), + DateUtils.formatDateTime(new Date()), + new SimpleStringProperty(DateUtils.formatDateTime(new Date())), + remoteUrl, + new SimpleStringProperty(local), + new SimpleStringProperty(), + new SimpleStringProperty(), + new SimpleIntegerProperty(0), + new SimpleDoubleProperty(0.0), + new SimpleBooleanProperty(false) + ); + H2PoolUtils.insertProjectInfo(newProject); + } catch (AuthException e) { + // 弹出输入权限界面 + authPane = AuthenticationPane.getInstance(); + authPane.refreshData(remoteUrl, (username, password) -> cloneRepo(JGitUtils.createCredential(username, password), true)); + throw new AuthException(); + } } - String branch = ""; - try { - // 开始下载 - branch = JGitUtils.cloneRepo(remoteUrl, localRepoFile, provider, customProgressMonitor); - } catch (AuthException e) { - // 弹出输入权限界面 - AuthenticationPane authPane = AuthenticationPane.getInstance(); - authPane.refreshData(remoteUrl, (username, password) -> this.cloneRepo(JGitUtils.createCredential(username, password), true)); - Platform.runLater(() -> authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene"))); - retryButton.setVisible(true); - return; - } catch (TimeOutException | JGitException e) { - retryButton.setVisible(true); - return; + @Override + public void success() { + authPane = null; + FxApplicationContextUtils.GIT_PROJECT_OBSERVABLE_LIST.add(newProject); + // 更新下载数量-1 + FxApplicationContextUtils.DOWNLOAD_PROPERTY.set(String.valueOf(FxApplicationContextUtils.DOWNLOAD_NUMBER.decrementAndGet())); } - // 下载完成入库 - String name = getRepoName(remoteUrl); - String author = getAuthor(remoteUrl); - String local = localRepoFile.getAbsolutePath(); - GitProject newProject = new GitProject(new SimpleIntegerProperty(0), - new SimpleStringProperty(name), - new SimpleStringProperty(author), - new SimpleStringProperty(branch), - DateUtils.formatDateTime(new Date()), - new SimpleStringProperty(DateUtils.formatDateTime(new Date())), - remoteUrl, - new SimpleStringProperty(local), - new SimpleStringProperty(), - new SimpleStringProperty(), - new SimpleIntegerProperty(0), - new SimpleDoubleProperty(0.0), - new SimpleBooleanProperty(false) - ); - H2PoolUtils.insertProjectInfo(newProject); - FxApplicationContextUtils.GIT_PROJECT_OBSERVABLE_LIST.add(newProject); - // 更新下载数量-1 - FxApplicationContextUtils.DOWNLOAD_PROPERTY.set(String.valueOf(FxApplicationContextUtils.DOWNLOAD_NUMBER.decrementAndGet())); + @Override + public void fail() { + if (authPane != null) { + authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene")); + } + retryButton.setVisible(true); + } }); } diff --git a/src/main/java/com/light/component/LevelTableCell.java b/src/main/java/com/light/component/LevelTableCell.java index 74cd218..5604dd4 100644 --- a/src/main/java/com/light/component/LevelTableCell.java +++ b/src/main/java/com/light/component/LevelTableCell.java @@ -1,6 +1,7 @@ package com.light.component; import com.light.model.GitProject; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; import com.light.util.H2PoolUtils; import javafx.collections.FXCollections; @@ -61,7 +62,22 @@ public class LevelTableCell extends TableCell { if (!choiceBox.isShowing()) { commitEdit(choiceBox.getValue()); if (oldValue != choiceBox.getValue()) { - AsyncTask.runOnce("更新学习等级", () -> H2PoolUtils.updateGitProject(getTableRow().getItem())); + AsyncTask.runOnce("更新学习等级", new AsyncEvent() { + @Override + public void handler() throws Exception { + H2PoolUtils.updateGitProject(getTableRow().getItem()); + } + + @Override + public void success() { + + } + + @Override + public void fail() { + + } + }); } } }); diff --git a/src/main/java/com/light/component/OperationTableCell.java b/src/main/java/com/light/component/OperationTableCell.java index ebaee27..30ee231 100644 --- a/src/main/java/com/light/component/OperationTableCell.java +++ b/src/main/java/com/light/component/OperationTableCell.java @@ -4,20 +4,28 @@ import atlantafx.base.theme.Styles; import com.light.exception.AuthException; import com.light.exception.JGitException; import com.light.exception.TimeOutException; +import com.light.model.GitAuthInfo; import com.light.model.GitProject; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; +import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; +import com.light.util.H2PoolUtils; import com.light.util.JGitUtils; import com.light.view.ManagerView; +import javafx.application.Platform; import javafx.beans.property.SimpleDoubleProperty; import javafx.geometry.Pos; +import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.layout.HBox; import javafx.util.Callback; +import org.eclipse.jgit.transport.CredentialsProvider; import java.io.File; +import java.util.Date; /** * 操作列 - 按钮 @@ -66,19 +74,64 @@ public class OperationTableCell extends TableCell { if (null != project) { // 更新更新数量+1 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.incrementAndGet())); - AsyncTask.runOnce("更新项目", () -> { - File localRepoFile = new File(project.local().get()); - String remoteUrl = project.remote(); - try { - ManagerView.pull(project, localRepoFile, remoteUrl, rate); - } catch (AuthException e) { - ManagerView.showAuthPane(remoteUrl, localRepoFile, project, rate, updateButton); - } catch (TimeOutException | JGitException ignored) { + AsyncTask.runOnce("更新项目", new AsyncEvent() { + private AuthenticationPane authPane; + + @Override + public void handler() throws Exception { + File localRepoFile = new File(project.local().get()); + String remoteUrl = project.remote(); + try { + authPane = null; + ManagerView.pull(project, localRepoFile, remoteUrl, rate); + } catch (AuthException e) { + authPane = AuthenticationPane.getInstance(); + authPane.refreshData(remoteUrl, (username, password) -> { + GitAuthInfo authInfo = authPane.dealAuthInfo(username, password, JGitUtils.getType(remoteUrl)); + if (authInfo != null) { + // 更新 + // 更新更新数量+1 + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.incrementAndGet())); + try { + CredentialsProvider provider = JGitUtils.createCredential(username, password); + boolean pull = JGitUtils.pull(remoteUrl, localRepoFile, provider, rate); + if (pull) { + project.updateTime().set(DateUtils.formatDateTime(new Date())); + H2PoolUtils.updateGitProject(project); + project.selected().set(false); + } + } catch (AuthException e1) { + // 弹出输入权限界面 + Platform.runLater(() -> authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene"))); + } catch (TimeOutException | JGitException ignored) { + + } + // 更新更新数量-1 + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + } + }); + throw new AuthException(); + } + } + + @Override + public void success() { + // 更新更新数量-1 + authPane = null; + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + updateButton.setDisable(false); + } + + @Override + public void fail() { + if (authPane != null) { + authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene")); + } + // 更新更新数量-1 + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + updateButton.setDisable(false); } - // 更新更新数量-1 - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); - updateButton.setDisable(false); }); } }); diff --git a/src/main/java/com/light/theme/ThemeDialog.java b/src/main/java/com/light/theme/ThemeDialog.java index 8058c76..90bdcaf 100644 --- a/src/main/java/com/light/theme/ThemeDialog.java +++ b/src/main/java/com/light/theme/ThemeDialog.java @@ -4,6 +4,7 @@ package com.light.theme; import atlantafx.base.theme.Theme; import com.light.layout.ModalDialog; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; @@ -39,7 +40,22 @@ public final class ThemeDialog extends ModalDialog { if (val != null && val.getUserData() instanceof Theme theme) { FxApplicationContextUtils.CURRENT_THEME_NAME.set(theme.getName()); Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()); - AsyncTask.runOnce("主题更新", () -> H2PoolUtils.updateDictData("GIT_CURRENT_THEME", theme.getName())); + AsyncTask.runOnce("主题更新", new AsyncEvent() { + @Override + public void handler() throws Exception { + H2PoolUtils.updateDictData("GIT_CURRENT_THEME", theme.getName()); + } + + @Override + public void success() { + + } + + @Override + public void fail() { + + } + }); } }); } diff --git a/src/main/java/com/light/thread/AsyncEvent.java b/src/main/java/com/light/thread/AsyncEvent.java index 0ec782a..7dcfbd5 100644 --- a/src/main/java/com/light/thread/AsyncEvent.java +++ b/src/main/java/com/light/thread/AsyncEvent.java @@ -3,4 +3,8 @@ package com.light.thread; public interface AsyncEvent { void handler() throws Exception; + + void success(); + + void fail(); } diff --git a/src/main/java/com/light/thread/AsyncTask.java b/src/main/java/com/light/thread/AsyncTask.java index 8fff8da..8a41eaa 100644 --- a/src/main/java/com/light/thread/AsyncTask.java +++ b/src/main/java/com/light/thread/AsyncTask.java @@ -20,34 +20,37 @@ public class AsyncTask extends Task { this.startTime = System.currentTimeMillis(); } + /** + * 普通线程 + * + * @return + * @throws Exception + */ @Override protected Void call() throws Exception { - try { - LOGGER.info("Task {} 开始执行", description); - asyncEvent.handler(); - } catch (Exception e) { - LOGGER.info("Task {} 执行异常:{}", description, e.getMessage()); - } + LOGGER.info("Task {} 开始执行", description); + asyncEvent.handler(); return null; } @Override protected void succeeded() { super.succeeded(); + // 更新JavaFX的主线程的代码放在此处 + asyncEvent.success(); LOGGER.info("Task {} 执行结束,耗时 {} ms", description, System.currentTimeMillis() - startTime); } @Override protected void failed() { super.failed(); + // 更新JavaFX的主线程的代码放在此处 + asyncEvent.fail(); LOGGER.info("Task {} 执行失败", description); } - public static void runOnce(AsyncEvent event) { - runOnce("任务", event); - } public static void runOnce(String description, AsyncEvent event) { - GitThreadPool.EXECUTOR_SERVICE.execute(new AsyncTask(description, event)); + GitThreadPool.EXECUTOR_VIRTUAL_SERVICE.execute(new AsyncTask(description, event)); } } diff --git a/src/main/java/com/light/thread/GitThreadPool.java b/src/main/java/com/light/thread/GitThreadPool.java index 0572585..54ec11a 100644 --- a/src/main/java/com/light/thread/GitThreadPool.java +++ b/src/main/java/com/light/thread/GitThreadPool.java @@ -12,6 +12,7 @@ public class GitThreadPool { // 普通线程池 public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(10); + public static final ExecutorService EXECUTOR_VIRTUAL_SERVICE = Executors.newVirtualThreadPerTaskExecutor(); // 定时线程池 public static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE = Executors.newScheduledThreadPool(5); @@ -23,6 +24,9 @@ public class GitThreadPool { if (!SCHEDULED_EXECUTOR_SERVICE.isShutdown()) { SCHEDULED_EXECUTOR_SERVICE.shutdown(); } + if (!EXECUTOR_VIRTUAL_SERVICE.isShutdown()) { + EXECUTOR_VIRTUAL_SERVICE.shutdown(); + } LOGGER.info("线程池关闭"); } } diff --git a/src/main/java/com/light/view/ManagerView.java b/src/main/java/com/light/view/ManagerView.java index 1368d2c..7b2d84b 100644 --- a/src/main/java/com/light/view/ManagerView.java +++ b/src/main/java/com/light/view/ManagerView.java @@ -13,6 +13,7 @@ import com.light.exception.JGitException; import com.light.exception.TimeOutException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; +import com.light.thread.AsyncEvent; import com.light.thread.AsyncTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; @@ -158,9 +159,22 @@ public class ManagerView extends StackPane { dirChooser.setInitialDirectory(new File(H2PoolUtils.queryDictByLabel("GIT_CURRENT_LOCAL_DIR", "D:") + File.separator)); File file = dirChooser.showDialog(getScene().getWindow()); if (null != file) { - AsyncTask.runOnce("加载本地项目", () -> { - JGitUtils.parseLocalProjectPath(file); - JGitUtils.parseLocalProject(); + AsyncTask.runOnce("加载本地项目", new AsyncEvent() { + @Override + public void handler() throws Exception { + JGitUtils.parseLocalProjectPath(file); + JGitUtils.parseLocalProject(); + } + + @Override + public void success() { + + } + + @Override + public void fail() { + + } }); } }); @@ -193,29 +207,41 @@ public class ManagerView extends StackPane { } // 更新更新数量 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.addAndGet(list.size()))); - List> partitioned = Lists.partition(list, list.size() / 5); - partitioned.forEach(partitionList -> AsyncTask.runOnce("更新项目", () -> { - partitionList.forEach(param -> { - SimpleDoubleProperty rate = param.downloadRate(); - File localRepoFile = new File(param.local().get()); - String remoteUrl = param.remote(); - try { - if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { - pull(param, localRepoFile, remoteUrl, rate); - } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { - pull(param, localRepoFile, remoteUrl, rate); + List> partitioned = Lists.partition(list, Math.abs(list.size() / 5)); + partitioned.forEach(partitionList -> AsyncTask.runOnce("更新项目", new AsyncEvent() { + @Override + public void handler() throws Exception { + partitionList.forEach(param -> { + SimpleDoubleProperty rate = param.downloadRate(); + File localRepoFile = new File(param.local().get()); + String remoteUrl = param.remote(); + try { + if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { + pull(param, localRepoFile, remoteUrl, rate); + } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { + pull(param, localRepoFile, remoteUrl, rate); + } + } catch (AuthException e) { + LOGGER.error("项目 {} 需要权限", remoteUrl); + } catch (TimeOutException | JGitException ignored) { + + } catch (Exception e) { + LOGGER.error("项目更新异常:{}", e.getMessage()); } - } catch (AuthException e) { - LOGGER.error("项目 {} 需要权限", remoteUrl); - } catch (TimeOutException | JGitException ignored) { + // 更新更新数量-1 + Platform.runLater(() -> FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet()))); + }); + } - } catch (Exception e) { - LOGGER.error("项目更新异常:{}", e.getMessage()); - } - // 更新更新数量-1 - Platform.runLater(() -> FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet()))); - }); - updateButton.setDisable(false); + @Override + public void success() { + updateButton.setDisable(false); + } + + @Override + public void fail() { + updateButton.setDisable(false); + } })); event.consume(); }); @@ -235,36 +261,6 @@ public class ManagerView extends StackPane { }); } - public static void showAuthPane(String remoteUrl, File file, GitProject project, SimpleDoubleProperty rate, Button updateButton) throws Exception { - // 弹出输入权限界面 - AuthenticationPane authPane = AuthenticationPane.getInstance(); - authPane.refreshData(remoteUrl, (username, password) -> { - GitAuthInfo authInfo = authPane.dealAuthInfo(username, password, JGitUtils.getType(remoteUrl)); - if (authInfo != null) { - // 更新 - // 更新更新数量+1 - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.incrementAndGet())); - try { - CredentialsProvider provider = JGitUtils.createCredential(username, password); - boolean pull = JGitUtils.pull(remoteUrl, file, provider, rate); - if (pull) { - project.updateTime().set(DateUtils.formatDateTime(new Date())); - H2PoolUtils.updateGitProject(project); - project.selected().set(false); - } - } catch (AuthException e1) { - // 弹出输入权限界面 - Platform.runLater(() -> authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene"))); - } catch (TimeOutException | JGitException ignored) { - - } - // 更新更新数量-1 - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); - } - }); - Platform.runLater(() -> authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene"))); - } - public static void pull(GitProject project, File localRepoFile, String remoteUrl, SimpleDoubleProperty rate) { GitAuthInfo existsAuthInfo = JGitUtils.isExistsAuthInfo(project.remote()); CredentialsProvider provider = null; -- Gitee From ad76b0ef42d95e4ccbd582f6b418d89b2339480b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Tue, 17 Oct 2023 16:41:48 +0800 Subject: [PATCH 03/10] =?UTF-8?q?+=20=E5=90=AF=E5=8A=A8=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/light/view/ManagerView.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/light/view/ManagerView.java b/src/main/java/com/light/view/ManagerView.java index 7b2d84b..d616e85 100644 --- a/src/main/java/com/light/view/ManagerView.java +++ b/src/main/java/com/light/view/ManagerView.java @@ -4,7 +4,6 @@ import atlantafx.base.controls.CustomTextField; import atlantafx.base.theme.Styles; import atlantafx.base.theme.Tweaks; import com.google.common.collect.Lists; -import com.light.component.AuthenticationPane; import com.light.component.LevelTableCell; import com.light.component.OperationTableCell; import com.light.component.TooltipTableRow; @@ -23,7 +22,6 @@ import javafx.application.Platform; import javafx.beans.property.SimpleDoubleProperty; import javafx.collections.FXCollections; import javafx.geometry.Insets; -import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.TableColumn; @@ -207,7 +205,7 @@ public class ManagerView extends StackPane { } // 更新更新数量 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.addAndGet(list.size()))); - List> partitioned = Lists.partition(list, Math.abs(list.size() / 5)); + List> partitioned = Lists.partition(list, Math.ceilDiv(list.size(), 5)); partitioned.forEach(partitionList -> AsyncTask.runOnce("更新项目", new AsyncEvent() { @Override public void handler() throws Exception { -- Gitee From 242c82b72415f6c372a7644a6460735dff99f6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=A3?= <18600824670@163.com> Date: Tue, 17 Oct 2023 17:34:33 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=89=93=E8=B5=8F=E4=BD=9C=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/component/PaymentQRCodePane.java | 18 ++++++++++++++ src/main/java/com/light/layout/MenuPane.java | 22 ++++++++++++++++-- src/main/resources/css/menu.css | 5 ++++ src/main/resources/icons/author.png | Bin 0 -> 471 bytes src/main/resources/icons/qrcode.jpg | Bin 0 -> 205963 bytes 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/light/component/PaymentQRCodePane.java create mode 100644 src/main/resources/icons/author.png create mode 100644 src/main/resources/icons/qrcode.jpg diff --git a/src/main/java/com/light/component/PaymentQRCodePane.java b/src/main/java/com/light/component/PaymentQRCodePane.java new file mode 100644 index 0000000..aaf793b --- /dev/null +++ b/src/main/java/com/light/component/PaymentQRCodePane.java @@ -0,0 +1,18 @@ +package com.light.component; + +import com.light.layout.ModalDialog; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + + +public class PaymentQRCodePane extends ModalDialog { + + public PaymentQRCodePane(){ + header.setTitle("打赏作者"); + Image qrCode = new Image("/icons/qrcode.jpg"); + ImageView qrCodeView = new ImageView(qrCode); + qrCodeView.setFitWidth(300); + qrCodeView.setFitHeight(350); + content.setBody(qrCodeView); + } +} diff --git a/src/main/java/com/light/layout/MenuPane.java b/src/main/java/com/light/layout/MenuPane.java index 2a4a86a..cf9ad30 100644 --- a/src/main/java/com/light/layout/MenuPane.java +++ b/src/main/java/com/light/layout/MenuPane.java @@ -3,6 +3,7 @@ package com.light.layout; import atlantafx.base.theme.Styles; import com.light.component.DownAndUpdatePane; import com.light.component.NoticePane; +import com.light.component.PaymentQRCodePane; import com.light.theme.ThemeDialog; import com.light.util.FxApplicationContextUtils; import com.light.util.FxUtil; @@ -11,15 +12,20 @@ import com.light.view.HomeView; import com.light.view.ManagerView; import com.light.view.NotificationView; import javafx.collections.ListChangeListener; +import javafx.event.Event; import javafx.geometry.Orientation; import javafx.geometry.Pos; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.Separator; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.text.Font; import javafx.scene.text.Text; import org.kordamp.ikonli.antdesignicons.AntDesignIconsFilled; import org.kordamp.ikonli.antdesignicons.AntDesignIconsOutlined; @@ -49,7 +55,12 @@ public class MenuPane extends StackPane { private final HBox updateBox = new HBox(10, updateLabel, updateLabelText); private final VBox bottomMenu = new VBox(downloadBox, updateBox); - private final VBox asideContainer = new VBox(topMenu, new Separator(Orientation.HORIZONTAL), dynamicMenu, new Separator(Orientation.HORIZONTAL), bottomMenu); + //底部导航栏打赏作者 + private final Button payQRCodeBtn = new Button(); + + private final HBox bottomBox = new HBox(10, bottomMenu, payQRCodeBtn); + + private final VBox asideContainer = new VBox(topMenu, new Separator(Orientation.HORIZONTAL), dynamicMenu, new Separator(Orientation.HORIZONTAL), bottomBox); private final ContentPane contentPane; @@ -80,7 +91,10 @@ public class MenuPane extends StackPane { this.bottomMenu.getStyleClass().add("down-update"); this.downloadLabel.getStyleClass().add("download-label"); this.updateLabel.getStyleClass().add("update-label"); - + Image author = new Image("/icons/author.png"); + ImageView authorView = new ImageView(author); + this.payQRCodeBtn.setGraphic(authorView); + this.payQRCodeBtn.getStyleClass().add("payment-qrcode"); // 直接设置样式 downloadBox.setAlignment(Pos.CENTER_LEFT); downloadLabelText.getStyleClass().addAll(Styles.TEXT, Styles.SUCCESS); @@ -121,5 +135,9 @@ public class MenuPane extends StackPane { downloadLabel.setOnMouseClicked(event -> { downloadPane.show(getScene()); }); + + PaymentQRCodePane paymentQRCodePane = new PaymentQRCodePane(); + payQRCodeBtn.setOnMouseClicked(Event -> paymentQRCodePane.show(getScene())); + } } diff --git a/src/main/resources/css/menu.css b/src/main/resources/css/menu.css index f2a1ba5..6eb5422 100644 --- a/src/main/resources/css/menu.css +++ b/src/main/resources/css/menu.css @@ -151,4 +151,9 @@ .cf-message.danger > .ikonli-font-icon { -fx-icon-color: -cf-danger-color; +} + +.payment-qrcode { + -fx-pref-width: 50px; + -fx-pref-height: 50px; } \ No newline at end of file diff --git a/src/main/resources/icons/author.png b/src/main/resources/icons/author.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee94d2d0529fbd76aa26b7237da76ff33528904 GIT binary patch literal 471 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 Cbo)mD literal 0 HcmV?d00001 -- Gitee From f1205ceca8cec81a510a586af718b77ec09f0416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Tue, 17 Oct 2023 23:09:20 +0800 Subject: [PATCH 05/10] =?UTF-8?q?+=20=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/light/layout/MenuPane.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/light/layout/MenuPane.java b/src/main/java/com/light/layout/MenuPane.java index cf9ad30..c0c2224 100644 --- a/src/main/java/com/light/layout/MenuPane.java +++ b/src/main/java/com/light/layout/MenuPane.java @@ -47,10 +47,10 @@ public class MenuPane extends StackPane { private final ListView dynamicMenu = new ListView<>(); // 底部导航栏 - private final Label downloadLabel = new Label("正在下载", new FontIcon(BootstrapIcons.ARROW_DOWN)); + private final Label downloadLabel = new Label("下载中", new FontIcon(BootstrapIcons.ARROW_DOWN)); private final Text downloadLabelText = new Text(FxApplicationContextUtils.DOWNLOAD_PROPERTY.getValue()); private final HBox downloadBox = new HBox(10, downloadLabel, downloadLabelText); - private final Label updateLabel = new Label("正在更新", new FontIcon(BootstrapIcons.ARROW_DOWN)); + private final Label updateLabel = new Label("更新中", new FontIcon(BootstrapIcons.ARROW_DOWN)); private final Text updateLabelText = new Text(FxApplicationContextUtils.UPDATE_PROPERTY.getValue()); private final HBox updateBox = new HBox(10, updateLabel, updateLabelText); private final VBox bottomMenu = new VBox(downloadBox, updateBox); @@ -94,13 +94,13 @@ public class MenuPane extends StackPane { Image author = new Image("/icons/author.png"); ImageView authorView = new ImageView(author); this.payQRCodeBtn.setGraphic(authorView); - this.payQRCodeBtn.getStyleClass().add("payment-qrcode"); + payQRCodeBtn.getStyleClass().addAll(Styles.FLAT, Styles.ACCENT); // 直接设置样式 downloadBox.setAlignment(Pos.CENTER_LEFT); downloadLabelText.getStyleClass().addAll(Styles.TEXT, Styles.SUCCESS); updateBox.setAlignment(Pos.CENTER_LEFT); updateLabelText.getStyleClass().addAll(Styles.TEXT, Styles.WARNING); - + HBox.setHgrow(bottomMenu, Priority.ALWAYS); initEvent(); } -- Gitee From 32dce4f6d57a8238364c251ee89325068a40c00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Thu, 19 Oct 2023 20:38:34 +0800 Subject: [PATCH 06/10] =?UTF-8?q?+=20=E5=90=AF=E5=8A=A8=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/light/thread/FxAsyncService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/light/thread/FxAsyncService.java diff --git a/src/main/java/com/light/thread/FxAsyncService.java b/src/main/java/com/light/thread/FxAsyncService.java new file mode 100644 index 0000000..5783673 --- /dev/null +++ b/src/main/java/com/light/thread/FxAsyncService.java @@ -0,0 +1,13 @@ +package com.light.thread; + +import javafx.concurrent.Service; +import javafx.concurrent.Task; + +public class FxAsyncService extends Service { + @Override + protected Task createTask() { + return null; + } + + +} -- Gitee From 26e774d2ce5c567036f3ed978dea8493a322b461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Thu, 19 Oct 2023 22:38:41 +0800 Subject: [PATCH 07/10] =?UTF-8?q?+=20=E5=A4=A7=E7=89=88=E6=9C=AC=203.0=20-?= =?UTF-8?q?=20=E5=BC=82=E6=AD=A5=E7=BA=BF=E7=A8=8B=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20-=20=E9=87=8C=E7=A8=8B=E7=A2=913.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- src/main/java/com/light/GitManagerApp.java | 77 +++---- .../java/com/light/theme/ThemeDialog.java | 20 +- .../java/com/light/thread/FxAsyncTask.java | 195 ++++++++++++++++++ src/main/java/com/light/thread/Run.java | 5 + src/main/java/com/light/thread/RunBack.java | 6 + src/main/java/com/light/thread/RunFail.java | 5 + .../java/com/light/thread/RunSuccess.java | 6 + 8 files changed, 253 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/light/thread/FxAsyncTask.java create mode 100644 src/main/java/com/light/thread/Run.java create mode 100644 src/main/java/com/light/thread/RunBack.java create mode 100644 src/main/java/com/light/thread/RunFail.java create mode 100644 src/main/java/com/light/thread/RunSuccess.java diff --git a/pom.xml b/pom.xml index 0b3db6d..36c00ec 100644 --- a/pom.xml +++ b/pom.xml @@ -6,13 +6,13 @@ com.light GitManagerClientFx - 2.0 + 3.0 21 21 UTF-8 - 21 + 21.0.1 2.0.1 diff --git a/src/main/java/com/light/GitManagerApp.java b/src/main/java/com/light/GitManagerApp.java index 85d9a73..6804f8e 100644 --- a/src/main/java/com/light/GitManagerApp.java +++ b/src/main/java/com/light/GitManagerApp.java @@ -4,8 +4,7 @@ import atlantafx.base.controls.ModalPane; import atlantafx.base.theme.*; import com.light.layout.ContentPane; import com.light.layout.MenuPane; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; import com.light.thread.GitThreadPool; import com.light.util.FxApplicationContextUtils; import com.light.util.FxUtil; @@ -31,49 +30,37 @@ public class GitManagerApp extends Application { public void init() throws Exception { startTime = System.currentTimeMillis(); super.init(); - AsyncTask.runOnce("初始化数据库和主题数据", new AsyncEvent() { - - private String themeName = "Primer Light"; - - @Override - public void handler() throws Exception { - String gitDbInit = H2PoolUtils.queryDictByLabel("GIT_DB_INIT", "0"); - if ("0".equals(gitDbInit)) { - H2PoolUtils.createTable(); - H2PoolUtils.initGitProjectDictData(); - } - - FxApplicationContextUtils.THEME_LIST.add(new PrimerLight()); - FxApplicationContextUtils.THEME_LIST.add(new PrimerDark()); - FxApplicationContextUtils.THEME_LIST.add(new NordLight()); - FxApplicationContextUtils.THEME_LIST.add(new NordDark()); - FxApplicationContextUtils.THEME_LIST.add(new CupertinoLight()); - FxApplicationContextUtils.THEME_LIST.add(new CupertinoDark()); - FxApplicationContextUtils.THEME_LIST.add(new Dracula()); - - // 设置主题 - themeName = H2PoolUtils.queryDictByLabel("GIT_CURRENT_THEME", "Primer Light"); - } - - @Override - public void success() { - FxApplicationContextUtils.CURRENT_THEME_NAME.set(themeName); - FxApplicationContextUtils.THEME_LIST.stream() - .filter(theme -> theme.getName().equals(themeName)) - .findFirst() - .ifPresentOrElse(theme -> Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()), - () -> Application.setUserAgentStylesheet(FxApplicationContextUtils.THEME_LIST.getFirst().getUserAgentStylesheet()) - ); - - // 查询所有项目数据 - H2PoolUtils.queryGitProjects(); - } - - @Override - public void fail() { - - } - }); + + FxAsyncTask.runOnceBack(startTime, "初始化数据库和主题数据", + () -> { + String gitDbInit = H2PoolUtils.queryDictByLabel("GIT_DB_INIT", "0"); + if ("0".equals(gitDbInit)) { + H2PoolUtils.createTable(); + H2PoolUtils.initGitProjectDictData(); + } + + FxApplicationContextUtils.THEME_LIST.add(new PrimerLight()); + FxApplicationContextUtils.THEME_LIST.add(new PrimerDark()); + FxApplicationContextUtils.THEME_LIST.add(new NordLight()); + FxApplicationContextUtils.THEME_LIST.add(new NordDark()); + FxApplicationContextUtils.THEME_LIST.add(new CupertinoLight()); + FxApplicationContextUtils.THEME_LIST.add(new CupertinoDark()); + FxApplicationContextUtils.THEME_LIST.add(new Dracula()); + // 设置主题 + return H2PoolUtils.queryDictByLabel("GIT_CURRENT_THEME", "Primer Light"); + }, + success -> { + FxApplicationContextUtils.CURRENT_THEME_NAME.set(success); + FxApplicationContextUtils.THEME_LIST.stream() + .filter(theme -> theme.getName().equals(success)) + .findFirst() + .ifPresentOrElse(theme -> Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()), + () -> Application.setUserAgentStylesheet(FxApplicationContextUtils.THEME_LIST.getFirst().getUserAgentStylesheet()) + ); + + // 查询所有项目数据 + H2PoolUtils.queryGitProjects(); + }); } @Override diff --git a/src/main/java/com/light/theme/ThemeDialog.java b/src/main/java/com/light/theme/ThemeDialog.java index 90bdcaf..7c2e9f7 100644 --- a/src/main/java/com/light/theme/ThemeDialog.java +++ b/src/main/java/com/light/theme/ThemeDialog.java @@ -4,8 +4,7 @@ package com.light.theme; import atlantafx.base.theme.Theme; import com.light.layout.ModalDialog; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; import javafx.application.Application; @@ -40,22 +39,7 @@ public final class ThemeDialog extends ModalDialog { if (val != null && val.getUserData() instanceof Theme theme) { FxApplicationContextUtils.CURRENT_THEME_NAME.set(theme.getName()); Application.setUserAgentStylesheet(theme.getUserAgentStylesheet()); - AsyncTask.runOnce("主题更新", new AsyncEvent() { - @Override - public void handler() throws Exception { - H2PoolUtils.updateDictData("GIT_CURRENT_THEME", theme.getName()); - } - - @Override - public void success() { - - } - - @Override - public void fail() { - - } - }); + FxAsyncTask.runOnce("主题更新同步数据库", () -> H2PoolUtils.updateDictData("GIT_CURRENT_THEME", theme.getName())); } }); } diff --git a/src/main/java/com/light/thread/FxAsyncTask.java b/src/main/java/com/light/thread/FxAsyncTask.java new file mode 100644 index 0000000..1153a21 --- /dev/null +++ b/src/main/java/com/light/thread/FxAsyncTask.java @@ -0,0 +1,195 @@ +package com.light.thread; + +import javafx.concurrent.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Optional; +import java.util.function.Consumer; + +/** + * 启用虚拟线程异步执行任务 - 工具类 + * 注意:为了能正确执行 成功和失败 方法,自定义方法中有异常要抛出,不要处理 + */ +public final class FxAsyncTask { + + public static final Logger LOGGER = LoggerFactory.getLogger(FxAsyncTask.class); + + /** + * 异步执行一次 + * + * @param run + * @param + * @return + */ + public static Task runOnce(Run run) { + return runOnce("异步执行一次", run); + } + + /** + * 异步执行一次 + * + * @param message + * @param run + * @param + * @return + */ + public static Task runOnce(String message, Run run) { + return runOnce(System.currentTimeMillis(), message, run); + } + + /** + * 异步执行一次 + * + * @param startTime + * @param message + * @param run + * @param + * @return + */ + public static Task runOnce(long startTime, String message, Run run) { + return runOnce(startTime, message, run, null); + } + + /** + * 异步执行一次 + * + * @param startTime + * @param message + * @param run + * @param success + * @param + * @return + */ + public static Task runOnce(long startTime, String message, Run run, RunSuccess success) { + return runOnce(startTime, message, run, success, null); + } + + /** + * 异步执行一次 + * + * @param startTime + * @param message + * @param run + * @param success + * @param fail + * @param + * @return + */ + public static Task runOnce(long startTime, String message, Run run, RunSuccess success, RunFail fail) { + Task task = new Task<>() { + @Override + protected T call() throws Exception { + LOGGER.info("Task {} 开始执行", message); + run.run(); + return null; + } + + @Override + protected void succeeded() { + super.succeeded(); + if (null != success) { + success.run(); + } + LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + + @Override + protected void failed() { + super.failed(); + if (null != fail) { + fail.run(); + } + LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + }; + Thread.startVirtualThread(task); + return task; + } + + /** + * 异步执行一次有返回值 + * + * @param runBack + * @param + * @return + */ + public static Task runOnceBack(RunBack runBack) { + return runOnceBack("异步执行一次有返回值", runBack); + } + + /** + * 异步执行一次有返回值 + * + * @param message + * @param runBack + * @param + * @return + */ + public static Task runOnceBack(String message, RunBack runBack) { + return runOnceBack(System.currentTimeMillis(), message, runBack); + } + + /** + * 异步执行一次有返回值 + * + * @param startTime + * @param message + * @param runBack + * @param + * @return + */ + public static Task runOnceBack(long startTime, String message, RunBack runBack) { + return runOnceBack(startTime, message, runBack, null); + } + + /** + * 异步执行一次有返回值 + * + * @param startTime + * @param message + * @param runBack + * @param + * @return + */ + public static Task runOnceBack(long startTime, String message, RunBack runBack, Consumer success) { + return runOnceBack(startTime, message, runBack, success, null); + } + + /** + * 异步执行一次有返回值 + * + * @param startTime + * @param message + * @param runBack 要处理的方法 + * @param success 成功后执行的方法 + * @param fail 失败后执行的方法 + * @param + * @return + */ + public static Task runOnceBack(long startTime, String message, RunBack runBack, Consumer success, Consumer fail) { + Task task = new Task<>() { + @Override + protected T call() throws Exception { + LOGGER.info("Task {} 开始执行", message); + return runBack.get(); + } + + @Override + protected void succeeded() { + super.succeeded(); + Optional.of(success).ifPresent(success -> success.accept(getValue())); + LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + + @Override + protected void failed() { + super.failed(); + Optional.of(fail).ifPresent(fail -> fail.accept(getValue())); + LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + }; + Thread.startVirtualThread(task); + return task; + } +} diff --git a/src/main/java/com/light/thread/Run.java b/src/main/java/com/light/thread/Run.java new file mode 100644 index 0000000..5eea1c0 --- /dev/null +++ b/src/main/java/com/light/thread/Run.java @@ -0,0 +1,5 @@ +package com.light.thread; + +public interface Run { + void run() throws Exception; +} diff --git a/src/main/java/com/light/thread/RunBack.java b/src/main/java/com/light/thread/RunBack.java new file mode 100644 index 0000000..999a7e5 --- /dev/null +++ b/src/main/java/com/light/thread/RunBack.java @@ -0,0 +1,6 @@ +package com.light.thread; + +public interface RunBack { + + T get() throws Exception; +} diff --git a/src/main/java/com/light/thread/RunFail.java b/src/main/java/com/light/thread/RunFail.java new file mode 100644 index 0000000..bbf518c --- /dev/null +++ b/src/main/java/com/light/thread/RunFail.java @@ -0,0 +1,5 @@ +package com.light.thread; + +public interface RunFail { + void run(); +} diff --git a/src/main/java/com/light/thread/RunSuccess.java b/src/main/java/com/light/thread/RunSuccess.java new file mode 100644 index 0000000..943ee74 --- /dev/null +++ b/src/main/java/com/light/thread/RunSuccess.java @@ -0,0 +1,6 @@ +package com.light.thread; + +public interface RunSuccess { + + void run(); +} -- Gitee From 4a6cd8ed42b43fe2b91226e29784a9d8d85811d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Thu, 19 Oct 2023 23:54:18 +0800 Subject: [PATCH 08/10] =?UTF-8?q?+=20=E7=BA=BF=E7=A8=8B=E6=B1=A0=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/light/thread/FxAsyncTask.java | 55 ++------------- src/main/java/com/light/thread/FxTask.java | 68 +++++++++++++++++++ .../com/light/thread/FxThreadPoolTask.java | 38 +++++++++++ 3 files changed, 113 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/light/thread/FxTask.java create mode 100644 src/main/java/com/light/thread/FxThreadPoolTask.java diff --git a/src/main/java/com/light/thread/FxAsyncTask.java b/src/main/java/com/light/thread/FxAsyncTask.java index 1153a21..d7e491f 100644 --- a/src/main/java/com/light/thread/FxAsyncTask.java +++ b/src/main/java/com/light/thread/FxAsyncTask.java @@ -4,12 +4,16 @@ import javafx.concurrent.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Optional; import java.util.function.Consumer; /** * 启用虚拟线程异步执行任务 - 工具类 + *

* 注意:为了能正确执行 成功和失败 方法,自定义方法中有异常要抛出,不要处理 + *

+ * 虚拟线程的应用场景主要包括 IO 密集型任务和高并发 Web 服务器等领域 + *

+ * 不支持 CPU 密集型任务、无法直接访问线程本地变量 */ public final class FxAsyncTask { @@ -77,32 +81,7 @@ public final class FxAsyncTask { * @return */ public static Task runOnce(long startTime, String message, Run run, RunSuccess success, RunFail fail) { - Task task = new Task<>() { - @Override - protected T call() throws Exception { - LOGGER.info("Task {} 开始执行", message); - run.run(); - return null; - } - - @Override - protected void succeeded() { - super.succeeded(); - if (null != success) { - success.run(); - } - LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); - } - - @Override - protected void failed() { - super.failed(); - if (null != fail) { - fail.run(); - } - LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); - } - }; + Task task = FxTask.createTask(startTime, message, run, success, fail); Thread.startVirtualThread(task); return task; } @@ -168,27 +147,7 @@ public final class FxAsyncTask { * @return */ public static Task runOnceBack(long startTime, String message, RunBack runBack, Consumer success, Consumer fail) { - Task task = new Task<>() { - @Override - protected T call() throws Exception { - LOGGER.info("Task {} 开始执行", message); - return runBack.get(); - } - - @Override - protected void succeeded() { - super.succeeded(); - Optional.of(success).ifPresent(success -> success.accept(getValue())); - LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); - } - - @Override - protected void failed() { - super.failed(); - Optional.of(fail).ifPresent(fail -> fail.accept(getValue())); - LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); - } - }; + Task task = FxTask.createTaskBack(startTime, message, runBack, success, fail); Thread.startVirtualThread(task); return task; } diff --git a/src/main/java/com/light/thread/FxTask.java b/src/main/java/com/light/thread/FxTask.java new file mode 100644 index 0000000..a79c7b2 --- /dev/null +++ b/src/main/java/com/light/thread/FxTask.java @@ -0,0 +1,68 @@ +package com.light.thread; + +import javafx.concurrent.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Optional; +import java.util.function.Consumer; + +/** + * 创建task工具类 + */ +public class FxTask { + public static final Logger LOGGER = LoggerFactory.getLogger(FxTask.class); + + public static Task createTask(long startTime, String message, Run run, RunSuccess success, RunFail fail) { + return new Task<>() { + @Override + protected T call() throws Exception { + LOGGER.info("Task {} 开始执行", message); + run.run(); + return null; + } + + @Override + protected void succeeded() { + super.succeeded(); + if (null != success) { + success.run(); + } + LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + + @Override + protected void failed() { + super.failed(); + if (null != fail) { + fail.run(); + } + LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + }; + } + + public static Task createTaskBack(long startTime, String message, RunBack runBack, Consumer success, Consumer fail) { + return new Task<>() { + @Override + protected T call() throws Exception { + LOGGER.info("Task {} 开始执行", message); + return runBack.get(); + } + + @Override + protected void succeeded() { + super.succeeded(); + Optional.of(success).ifPresent(success -> success.accept(getValue())); + LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + + @Override + protected void failed() { + super.failed(); + Optional.of(fail).ifPresent(fail -> fail.accept(getValue())); + LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); + } + }; + } +} diff --git a/src/main/java/com/light/thread/FxThreadPoolTask.java b/src/main/java/com/light/thread/FxThreadPoolTask.java new file mode 100644 index 0000000..d7d4375 --- /dev/null +++ b/src/main/java/com/light/thread/FxThreadPoolTask.java @@ -0,0 +1,38 @@ +package com.light.thread; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 利用线程池处理异步任务 + */ +public class FxThreadPoolTask { + public static final Logger LOGGER = LoggerFactory.getLogger(FxThreadPoolTask.class); + + // 普通线程池 + public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(10); + // 虚拟线程池 + public static final ExecutorService EXECUTOR_VIRTUAL_SERVICE = Executors.newVirtualThreadPerTaskExecutor(); + + public static void close() { + if (!EXECUTOR_SERVICE.isShutdown()) { + EXECUTOR_SERVICE.shutdown(); + LOGGER.info("普通线程池关闭"); + } + if (!EXECUTOR_VIRTUAL_SERVICE.isShutdown()) { + EXECUTOR_VIRTUAL_SERVICE.shutdown(); + LOGGER.info("虚拟线程池关闭"); + } + } + + public static void runPool() { + + } + + public static void runVirtualPool() { + + } +} -- Gitee From 251f5e865d179947a4952392ef3a077d3f94ca43 Mon Sep 17 00:00:00 2001 From: wangss <1063889643@qq.com> Date: Sun, 22 Oct 2023 10:05:56 +0800 Subject: [PATCH 09/10] =?UTF-8?q?+=20=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=E5=88=A0=E9=99=A4=203.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/light/GitManagerApp.java | 4 +- .../com/light/component/DownloadHBox.java | 114 ++++++++---------- .../com/light/component/LevelTableCell.java | 20 +-- .../light/component/OperationTableCell.java | 15 ++- .../java/com/light/thread/AsyncEvent.java | 10 -- src/main/java/com/light/thread/AsyncTask.java | 56 --------- .../java/com/light/thread/FxAsyncService.java | 13 -- .../java/com/light/thread/FxAsyncTask.java | 4 + .../com/light/thread/FxThreadPoolTask.java | 36 +++++- .../java/com/light/thread/GitThreadPool.java | 32 ----- src/main/java/com/light/util/FxUtil.java | 8 +- src/main/java/com/light/view/ManagerView.java | 85 +++++-------- 12 files changed, 135 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/com/light/thread/AsyncEvent.java delete mode 100644 src/main/java/com/light/thread/AsyncTask.java delete mode 100644 src/main/java/com/light/thread/FxAsyncService.java delete mode 100644 src/main/java/com/light/thread/GitThreadPool.java diff --git a/src/main/java/com/light/GitManagerApp.java b/src/main/java/com/light/GitManagerApp.java index 6804f8e..1586e3b 100644 --- a/src/main/java/com/light/GitManagerApp.java +++ b/src/main/java/com/light/GitManagerApp.java @@ -5,7 +5,7 @@ import atlantafx.base.theme.*; import com.light.layout.ContentPane; import com.light.layout.MenuPane; import com.light.thread.FxAsyncTask; -import com.light.thread.GitThreadPool; +import com.light.thread.FxThreadPoolTask; import com.light.util.FxApplicationContextUtils; import com.light.util.FxUtil; import com.light.util.H2PoolUtils; @@ -102,7 +102,7 @@ public class GitManagerApp extends Application { public void stop() throws Exception { super.stop(); H2PoolUtils.closeConnectionPool(); - GitThreadPool.close(); + FxThreadPoolTask.close(); } public static void main(String[] args) { diff --git a/src/main/java/com/light/component/DownloadHBox.java b/src/main/java/com/light/component/DownloadHBox.java index df8cf71..4bff0d3 100644 --- a/src/main/java/com/light/component/DownloadHBox.java +++ b/src/main/java/com/light/component/DownloadHBox.java @@ -4,16 +4,13 @@ import atlantafx.base.theme.Styles; import com.light.exception.AuthException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; import com.light.util.JGitUtils; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleDoubleProperty; -import javafx.beans.property.SimpleIntegerProperty; -import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.*; +import javafx.concurrent.Task; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; @@ -93,66 +90,55 @@ public class DownloadHBox extends HBox { */ public void cloneRepo(CredentialsProvider provider, boolean retry) { this.provider = provider; - AsyncTask.runOnce("克隆项目", new AsyncEvent() { + AuthenticationPane authPane = AuthenticationPane.getInstance(); - private GitProject newProject; - private AuthenticationPane authPane; - - @Override - public void handler() throws Exception { - - if (retry) { - deleteFiles(localRepoFile); - retryButton.setVisible(false); - } - - try { - authPane = null; - // 开始下载 - String branch = JGitUtils.cloneRepo(remoteUrl, localRepoFile, provider, customProgressMonitor); - // 下载完成入库 - String name = getRepoName(remoteUrl); - String author = getAuthor(remoteUrl); - String local = localRepoFile.getAbsolutePath(); - newProject = new GitProject(new SimpleIntegerProperty(0), - new SimpleStringProperty(name), - new SimpleStringProperty(author), - new SimpleStringProperty(branch), - DateUtils.formatDateTime(new Date()), - new SimpleStringProperty(DateUtils.formatDateTime(new Date())), - remoteUrl, - new SimpleStringProperty(local), - new SimpleStringProperty(), - new SimpleStringProperty(), - new SimpleIntegerProperty(0), - new SimpleDoubleProperty(0.0), - new SimpleBooleanProperty(false) - ); - H2PoolUtils.insertProjectInfo(newProject); - } catch (AuthException e) { - // 弹出输入权限界面 - authPane = AuthenticationPane.getInstance(); - authPane.refreshData(remoteUrl, (username, password) -> cloneRepo(JGitUtils.createCredential(username, password), true)); - throw new AuthException(); - } - } - - @Override - public void success() { - authPane = null; - FxApplicationContextUtils.GIT_PROJECT_OBSERVABLE_LIST.add(newProject); - // 更新下载数量-1 - FxApplicationContextUtils.DOWNLOAD_PROPERTY.set(String.valueOf(FxApplicationContextUtils.DOWNLOAD_NUMBER.decrementAndGet())); - } + Task task = FxAsyncTask.runOnceBack(System.currentTimeMillis(), "克隆项目", + () -> { + if (retry) { + deleteFiles(localRepoFile); + retryButton.setVisible(false); + } - @Override - public void fail() { - if (authPane != null) { - authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene")); - } - retryButton.setVisible(true); - } - }); + try { + // 开始下载 + String branch = JGitUtils.cloneRepo(remoteUrl, localRepoFile, provider, customProgressMonitor); + // 下载完成入库 + String name = getRepoName(remoteUrl); + String author = getAuthor(remoteUrl); + String local = localRepoFile.getAbsolutePath(); + GitProject newProject = new GitProject(new SimpleIntegerProperty(0), + new SimpleStringProperty(name), + new SimpleStringProperty(author), + new SimpleStringProperty(branch), + DateUtils.formatDateTime(new Date()), + new SimpleStringProperty(DateUtils.formatDateTime(new Date())), + remoteUrl, + new SimpleStringProperty(local), + new SimpleStringProperty(), + new SimpleStringProperty(), + new SimpleIntegerProperty(0), + new SimpleDoubleProperty(0.0), + new SimpleBooleanProperty(false) + ); + H2PoolUtils.insertProjectInfo(newProject); + + return newProject; + } catch (AuthException e) { + authPane.refreshData(remoteUrl, (username, password) -> cloneRepo(JGitUtils.createCredential(username, password), true)); + throw new AuthException(); + } + }, + success -> { + FxApplicationContextUtils.GIT_PROJECT_OBSERVABLE_LIST.add(success); + // 更新下载数量-1 + FxApplicationContextUtils.DOWNLOAD_PROPERTY.set(String.valueOf(FxApplicationContextUtils.DOWNLOAD_NUMBER.decrementAndGet())); + }, + fail -> { + if (authPane != null) { + authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene")); + } + retryButton.setVisible(true); + }); } private void deleteFiles(File folder) { diff --git a/src/main/java/com/light/component/LevelTableCell.java b/src/main/java/com/light/component/LevelTableCell.java index 5604dd4..6645907 100644 --- a/src/main/java/com/light/component/LevelTableCell.java +++ b/src/main/java/com/light/component/LevelTableCell.java @@ -1,8 +1,7 @@ package com.light.component; import com.light.model.GitProject; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; import com.light.util.H2PoolUtils; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -62,22 +61,7 @@ public class LevelTableCell extends TableCell { if (!choiceBox.isShowing()) { commitEdit(choiceBox.getValue()); if (oldValue != choiceBox.getValue()) { - AsyncTask.runOnce("更新学习等级", new AsyncEvent() { - @Override - public void handler() throws Exception { - H2PoolUtils.updateGitProject(getTableRow().getItem()); - } - - @Override - public void success() { - - } - - @Override - public void fail() { - - } - }); + FxAsyncTask.runOnce("更新学习等级", () -> H2PoolUtils.updateGitProject(getTableRow().getItem())); } } }); diff --git a/src/main/java/com/light/component/OperationTableCell.java b/src/main/java/com/light/component/OperationTableCell.java index 30ee231..573d88c 100644 --- a/src/main/java/com/light/component/OperationTableCell.java +++ b/src/main/java/com/light/component/OperationTableCell.java @@ -6,8 +6,7 @@ import com.light.exception.JGitException; import com.light.exception.TimeOutException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; @@ -15,6 +14,7 @@ import com.light.util.JGitUtils; import com.light.view.ManagerView; import javafx.application.Platform; import javafx.beans.property.SimpleDoubleProperty; +import javafx.concurrent.Task; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; @@ -74,12 +74,12 @@ public class OperationTableCell extends TableCell { if (null != project) { // 更新更新数量+1 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.incrementAndGet())); - AsyncTask.runOnce("更新项目", new AsyncEvent() { + FxAsyncTask.runOnceTask("更新项目", new Task() { private AuthenticationPane authPane; @Override - public void handler() throws Exception { + protected Object call() throws Exception { File localRepoFile = new File(project.local().get()); String remoteUrl = project.remote(); try { @@ -113,10 +113,12 @@ public class OperationTableCell extends TableCell { }); throw new AuthException(); } + return null; } @Override - public void success() { + protected void succeeded() { + super.succeeded(); // 更新更新数量-1 authPane = null; FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); @@ -124,7 +126,8 @@ public class OperationTableCell extends TableCell { } @Override - public void fail() { + protected void failed() { + super.failed(); if (authPane != null) { authPane.show((Scene) FxApplicationContextUtils.GLOBAL_CONTEXT_MAP.get("scene")); } diff --git a/src/main/java/com/light/thread/AsyncEvent.java b/src/main/java/com/light/thread/AsyncEvent.java deleted file mode 100644 index 7dcfbd5..0000000 --- a/src/main/java/com/light/thread/AsyncEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.light.thread; - -public interface AsyncEvent { - - void handler() throws Exception; - - void success(); - - void fail(); -} diff --git a/src/main/java/com/light/thread/AsyncTask.java b/src/main/java/com/light/thread/AsyncTask.java deleted file mode 100644 index 8a41eaa..0000000 --- a/src/main/java/com/light/thread/AsyncTask.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.light.thread; - -import javafx.concurrent.Task; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AsyncTask extends Task { - - public static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class); - - private final String description; - - private final long startTime; - - private final AsyncEvent asyncEvent; - - public AsyncTask(String description, AsyncEvent asyncEvent) { - this.description = description; - this.asyncEvent = asyncEvent; - this.startTime = System.currentTimeMillis(); - } - - /** - * 普通线程 - * - * @return - * @throws Exception - */ - @Override - protected Void call() throws Exception { - LOGGER.info("Task {} 开始执行", description); - asyncEvent.handler(); - return null; - } - - @Override - protected void succeeded() { - super.succeeded(); - // 更新JavaFX的主线程的代码放在此处 - asyncEvent.success(); - LOGGER.info("Task {} 执行结束,耗时 {} ms", description, System.currentTimeMillis() - startTime); - } - - @Override - protected void failed() { - super.failed(); - // 更新JavaFX的主线程的代码放在此处 - asyncEvent.fail(); - LOGGER.info("Task {} 执行失败", description); - } - - - public static void runOnce(String description, AsyncEvent event) { - GitThreadPool.EXECUTOR_VIRTUAL_SERVICE.execute(new AsyncTask(description, event)); - } -} diff --git a/src/main/java/com/light/thread/FxAsyncService.java b/src/main/java/com/light/thread/FxAsyncService.java deleted file mode 100644 index 5783673..0000000 --- a/src/main/java/com/light/thread/FxAsyncService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.light.thread; - -import javafx.concurrent.Service; -import javafx.concurrent.Task; - -public class FxAsyncService extends Service { - @Override - protected Task createTask() { - return null; - } - - -} diff --git a/src/main/java/com/light/thread/FxAsyncTask.java b/src/main/java/com/light/thread/FxAsyncTask.java index d7e491f..4b3c576 100644 --- a/src/main/java/com/light/thread/FxAsyncTask.java +++ b/src/main/java/com/light/thread/FxAsyncTask.java @@ -151,4 +151,8 @@ public final class FxAsyncTask { Thread.startVirtualThread(task); return task; } + + public static void runOnceTask(String message, Task task) { + Thread.startVirtualThread(task); + } } diff --git a/src/main/java/com/light/thread/FxThreadPoolTask.java b/src/main/java/com/light/thread/FxThreadPoolTask.java index d7d4375..53d558b 100644 --- a/src/main/java/com/light/thread/FxThreadPoolTask.java +++ b/src/main/java/com/light/thread/FxThreadPoolTask.java @@ -28,11 +28,43 @@ public class FxThreadPoolTask { } } - public static void runPool() { + /** + * 普通线程池执行task任务 + * + * @param message + * @param run + */ + public static void runPool(String message, Run run) { + runPool(System.currentTimeMillis(), message, run, null, null); + } + /** + * 普通线程池执行task任务 + * + * @param startTime + * @param message + * @param run + * @param success + * @param fail + */ + public static void runPool(long startTime, String message, Run run, RunSuccess success, RunFail fail) { + EXECUTOR_SERVICE.execute(FxTask.createTask(startTime, message, run, success, fail)); } - public static void runVirtualPool() { + public static void runVirtualPool(String message, Run run) { + runVirtualPool(System.currentTimeMillis(), message, run, null, null); + } + /** + * 虚拟线程池执行task任务 + * + * @param startTime + * @param message + * @param run + * @param success + * @param fail + */ + public static void runVirtualPool(long startTime, String message, Run run, RunSuccess success, RunFail fail) { + EXECUTOR_VIRTUAL_SERVICE.execute(FxTask.createTask(startTime, message, run, success, fail)); } } diff --git a/src/main/java/com/light/thread/GitThreadPool.java b/src/main/java/com/light/thread/GitThreadPool.java deleted file mode 100644 index 54ec11a..0000000 --- a/src/main/java/com/light/thread/GitThreadPool.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.light.thread; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - -public class GitThreadPool { - public static final Logger LOGGER = LoggerFactory.getLogger(GitThreadPool.class); - - // 普通线程池 - public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(10); - public static final ExecutorService EXECUTOR_VIRTUAL_SERVICE = Executors.newVirtualThreadPerTaskExecutor(); - - // 定时线程池 - public static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE = Executors.newScheduledThreadPool(5); - - public static void close() { - if (!EXECUTOR_SERVICE.isShutdown()) { - EXECUTOR_SERVICE.shutdown(); - } - if (!SCHEDULED_EXECUTOR_SERVICE.isShutdown()) { - SCHEDULED_EXECUTOR_SERVICE.shutdown(); - } - if (!EXECUTOR_VIRTUAL_SERVICE.isShutdown()) { - EXECUTOR_VIRTUAL_SERVICE.shutdown(); - } - LOGGER.info("线程池关闭"); - } -} diff --git a/src/main/java/com/light/util/FxUtil.java b/src/main/java/com/light/util/FxUtil.java index 1ac3cf3..c631cf6 100644 --- a/src/main/java/com/light/util/FxUtil.java +++ b/src/main/java/com/light/util/FxUtil.java @@ -175,8 +175,8 @@ public class FxUtil { * @param message */ public static void addNoticeList(String message) { - if (message.length() > 100) { - message = message.substring(0, 100); + if (message.length() > 200) { + message = message.substring(0, 200); } Text text = new Text(message); text.setWrappingWidth(500d); @@ -186,8 +186,6 @@ public class FxUtil { hBox.setAlignment(Pos.CENTER); HBox.setHgrow(text, Priority.ALWAYS); removeButton.setOnMouseClicked(event -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.remove(hBox)); - Platform.runLater(() -> { - FxApplicationContextUtils.HISTORY_NOTICE_LIST.add(0, hBox); - }); + Platform.runLater(() -> FxApplicationContextUtils.HISTORY_NOTICE_LIST.add(0, hBox)); } } diff --git a/src/main/java/com/light/view/ManagerView.java b/src/main/java/com/light/view/ManagerView.java index d616e85..1277374 100644 --- a/src/main/java/com/light/view/ManagerView.java +++ b/src/main/java/com/light/view/ManagerView.java @@ -7,18 +7,14 @@ import com.google.common.collect.Lists; import com.light.component.LevelTableCell; import com.light.component.OperationTableCell; import com.light.component.TooltipTableRow; -import com.light.exception.AuthException; -import com.light.exception.JGitException; -import com.light.exception.TimeOutException; import com.light.model.GitAuthInfo; import com.light.model.GitProject; -import com.light.thread.AsyncEvent; -import com.light.thread.AsyncTask; +import com.light.thread.FxAsyncTask; +import com.light.thread.FxThreadPoolTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; import com.light.util.H2PoolUtils; import com.light.util.JGitUtils; -import javafx.application.Platform; import javafx.beans.property.SimpleDoubleProperty; import javafx.collections.FXCollections; import javafx.geometry.Insets; @@ -157,22 +153,9 @@ public class ManagerView extends StackPane { dirChooser.setInitialDirectory(new File(H2PoolUtils.queryDictByLabel("GIT_CURRENT_LOCAL_DIR", "D:") + File.separator)); File file = dirChooser.showDialog(getScene().getWindow()); if (null != file) { - AsyncTask.runOnce("加载本地项目", new AsyncEvent() { - @Override - public void handler() throws Exception { - JGitUtils.parseLocalProjectPath(file); - JGitUtils.parseLocalProject(); - } - - @Override - public void success() { - - } - - @Override - public void fail() { - - } + FxAsyncTask.runOnce("加载本地项目", () -> { + JGitUtils.parseLocalProjectPath(file); + JGitUtils.parseLocalProject(); }); } }); @@ -206,41 +189,35 @@ public class ManagerView extends StackPane { // 更新更新数量 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.addAndGet(list.size()))); List> partitioned = Lists.partition(list, Math.ceilDiv(list.size(), 5)); - partitioned.forEach(partitionList -> AsyncTask.runOnce("更新项目", new AsyncEvent() { - @Override - public void handler() throws Exception { - partitionList.forEach(param -> { - SimpleDoubleProperty rate = param.downloadRate(); - File localRepoFile = new File(param.local().get()); - String remoteUrl = param.remote(); - try { - if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { - pull(param, localRepoFile, remoteUrl, rate); - } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { - pull(param, localRepoFile, remoteUrl, rate); - } - } catch (AuthException e) { - LOGGER.error("项目 {} 需要权限", remoteUrl); - } catch (TimeOutException | JGitException ignored) { - } catch (Exception e) { - LOGGER.error("项目更新异常:{}", e.getMessage()); - } - // 更新更新数量-1 - Platform.runLater(() -> FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet()))); - }); - } + FxAsyncTask.runOnce("全部更新", ()->{ - @Override - public void success() { - updateButton.setDisable(false); - } + }); - @Override - public void fail() { - updateButton.setDisable(false); - } - })); + partitioned.forEach(projectList ->{ + projectList.forEach(project->{ + + }); + }); + list.forEach(project -> FxThreadPoolTask.runVirtualPool(System.currentTimeMillis(), "更新项目", + () -> { + SimpleDoubleProperty rate = project.downloadRate(); + File localRepoFile = new File(project.local().get()); + String remoteUrl = project.remote(); + if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { + pull(project, localRepoFile, remoteUrl, rate); + } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { + pull(project, localRepoFile, remoteUrl, rate); + } + }, + () -> { + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + updateButton.setDisable(false); + selectAll.setSelected(false); + }, () -> { + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + updateButton.setDisable(false); + })); event.consume(); }); -- Gitee From b7f4cc6a050ea9e10f1fb9b8f83d2fc3d8a40add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=99=BD=E4=B8=8E=E5=AD=9F=E6=B5=A9=E7=84=B6?= <1063889643@qq.com> Date: Sun, 22 Oct 2023 22:10:56 +0800 Subject: [PATCH 10/10] =?UTF-8?q?+=20=E7=BA=BF=E7=A8=8B=E6=B1=A0=E4=BC=98?= =?UTF-8?q?=E5=8C=963.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/component/OperationTableCell.java | 10 ++- .../java/com/light/thread/FxAsyncTask.java | 1 + .../com/light/thread/FxThreadPoolTask.java | 21 +++++- src/main/java/com/light/view/ManagerView.java | 64 ++++++++++--------- 4 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/light/component/OperationTableCell.java b/src/main/java/com/light/component/OperationTableCell.java index 573d88c..8bb1900 100644 --- a/src/main/java/com/light/component/OperationTableCell.java +++ b/src/main/java/com/light/component/OperationTableCell.java @@ -23,6 +23,8 @@ import javafx.scene.control.TableColumn; import javafx.scene.layout.HBox; import javafx.util.Callback; import org.eclipse.jgit.transport.CredentialsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.util.Date; @@ -31,6 +33,8 @@ import java.util.Date; * 操作列 - 按钮 */ public class OperationTableCell extends TableCell { + + public static final Logger LOGGER = LoggerFactory.getLogger(OperationTableCell.class); Button updateButton = new Button("更新"); Button detailButton = new Button("详情"); HBox operationBox = new HBox(updateButton, detailButton); @@ -75,7 +79,9 @@ public class OperationTableCell extends TableCell { // 更新更新数量+1 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.incrementAndGet())); - FxAsyncTask.runOnceTask("更新项目", new Task() { + String message = "更新项目"; + long startTime = System.currentTimeMillis(); + FxAsyncTask.runOnceTask(message, new Task() { private AuthenticationPane authPane; @Override @@ -123,6 +129,7 @@ public class OperationTableCell extends TableCell { authPane = null; FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); updateButton.setDisable(false); + LOGGER.info("Task {} 执行成功,耗时 {} ms", message, System.currentTimeMillis() - startTime); } @Override @@ -134,6 +141,7 @@ public class OperationTableCell extends TableCell { // 更新更新数量-1 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); updateButton.setDisable(false); + LOGGER.info("Task {} 执行失败,耗时 {} ms", message, System.currentTimeMillis() - startTime); } }); } diff --git a/src/main/java/com/light/thread/FxAsyncTask.java b/src/main/java/com/light/thread/FxAsyncTask.java index 4b3c576..2ce9c6a 100644 --- a/src/main/java/com/light/thread/FxAsyncTask.java +++ b/src/main/java/com/light/thread/FxAsyncTask.java @@ -153,6 +153,7 @@ public final class FxAsyncTask { } public static void runOnceTask(String message, Task task) { + LOGGER.info("Task {} 开始执行", message); Thread.startVirtualThread(task); } } diff --git a/src/main/java/com/light/thread/FxThreadPoolTask.java b/src/main/java/com/light/thread/FxThreadPoolTask.java index 53d558b..41f227d 100644 --- a/src/main/java/com/light/thread/FxThreadPoolTask.java +++ b/src/main/java/com/light/thread/FxThreadPoolTask.java @@ -1,10 +1,12 @@ package com.light.thread; +import javafx.concurrent.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; /** * 利用线程池处理异步任务 @@ -17,6 +19,9 @@ public class FxThreadPoolTask { // 虚拟线程池 public static final ExecutorService EXECUTOR_VIRTUAL_SERVICE = Executors.newVirtualThreadPerTaskExecutor(); + // 当前正在处理的任务数(目前设定同时最多处理5个任务) + public static final AtomicInteger THREAD_DEALING_NUM = new AtomicInteger(0); + public static void close() { if (!EXECUTOR_SERVICE.isShutdown()) { EXECUTOR_SERVICE.shutdown(); @@ -48,7 +53,13 @@ public class FxThreadPoolTask { * @param fail */ public static void runPool(long startTime, String message, Run run, RunSuccess success, RunFail fail) { - EXECUTOR_SERVICE.execute(FxTask.createTask(startTime, message, run, success, fail)); + runPool(FxTask.createTask(startTime, message, run, success, fail)); + } + + public static void runPool(Task task) { + // 正在运行task +1 + THREAD_DEALING_NUM.incrementAndGet(); + EXECUTOR_SERVICE.execute(task); } public static void runVirtualPool(String message, Run run) { @@ -65,6 +76,12 @@ public class FxThreadPoolTask { * @param fail */ public static void runVirtualPool(long startTime, String message, Run run, RunSuccess success, RunFail fail) { - EXECUTOR_VIRTUAL_SERVICE.execute(FxTask.createTask(startTime, message, run, success, fail)); + runVirtualPool(FxTask.createTask(startTime, message, run, success, fail)); + } + + public static void runVirtualPool(Task task) { + // 正在运行task +1 + THREAD_DEALING_NUM.incrementAndGet(); + EXECUTOR_VIRTUAL_SERVICE.execute(task); } } diff --git a/src/main/java/com/light/view/ManagerView.java b/src/main/java/com/light/view/ManagerView.java index 1277374..56efdb5 100644 --- a/src/main/java/com/light/view/ManagerView.java +++ b/src/main/java/com/light/view/ManagerView.java @@ -3,13 +3,13 @@ package com.light.view; import atlantafx.base.controls.CustomTextField; import atlantafx.base.theme.Styles; import atlantafx.base.theme.Tweaks; -import com.google.common.collect.Lists; import com.light.component.LevelTableCell; import com.light.component.OperationTableCell; import com.light.component.TooltipTableRow; import com.light.model.GitAuthInfo; import com.light.model.GitProject; import com.light.thread.FxAsyncTask; +import com.light.thread.FxTask; import com.light.thread.FxThreadPoolTask; import com.light.util.DateUtils; import com.light.util.FxApplicationContextUtils; @@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.Date; +import java.util.Iterator; import java.util.List; public class ManagerView extends StackPane { @@ -180,6 +181,7 @@ public class ManagerView extends StackPane { // 全部更新按钮 updateButton.setOnMouseClicked(event -> { + event.consume(); JGitUtils.GITHUB_FAIL_NUMBER.set(0); JGitUtils.GITEE_FAIL_NUMBER.set(0); List list = tableView.getItems().stream().filter(param -> param.selected().get()).toList(); @@ -188,37 +190,39 @@ public class ManagerView extends StackPane { } // 更新更新数量 FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.addAndGet(list.size()))); - List> partitioned = Lists.partition(list, Math.ceilDiv(list.size(), 5)); - - FxAsyncTask.runOnce("全部更新", ()->{ - - }); - - partitioned.forEach(projectList ->{ - projectList.forEach(project->{ - - }); - }); - list.forEach(project -> FxThreadPoolTask.runVirtualPool(System.currentTimeMillis(), "更新项目", - () -> { - SimpleDoubleProperty rate = project.downloadRate(); - File localRepoFile = new File(project.local().get()); - String remoteUrl = project.remote(); - if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { - pull(project, localRepoFile, remoteUrl, rate); - } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { - pull(project, localRepoFile, remoteUrl, rate); + Iterator iterator = list.iterator(); + FxAsyncTask.runOnce(System.currentTimeMillis(), "批量更新", () -> { + while (iterator.hasNext()) { + if (FxThreadPoolTask.THREAD_DEALING_NUM.get() >= 5) { + Thread.sleep(1500); + continue; + } + GitProject project = iterator.next(); + FxThreadPoolTask.runVirtualPool(FxTask.createTask(System.currentTimeMillis(), "更新项目", + () -> { + SimpleDoubleProperty rate = project.downloadRate(); + File localRepoFile = new File(project.local().get()); + String remoteUrl = project.remote(); + if ("Gitee".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITEE_FAIL_NUMBER.get() < 10) { + pull(project, localRepoFile, remoteUrl, rate); + } else if ("Github".equals(JGitUtils.getType(remoteUrl)) && JGitUtils.GITHUB_FAIL_NUMBER.get() < 5) { + pull(project, localRepoFile, remoteUrl, rate); + } + }, + () -> { + // 正在运行task -1 + FxThreadPoolTask.THREAD_DEALING_NUM.decrementAndGet(); + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + selectAll.setSelected(false); + }, () -> { + // 正在运行task -1 + FxThreadPoolTask.THREAD_DEALING_NUM.decrementAndGet(); + FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); + })); } }, - () -> { - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); - updateButton.setDisable(false); - selectAll.setSelected(false); - }, () -> { - FxApplicationContextUtils.UPDATE_PROPERTY.set(String.valueOf(FxApplicationContextUtils.UPDATE_NUMBER.decrementAndGet())); - updateButton.setDisable(false); - })); - event.consume(); + () -> updateButton.setDisable(false), + () -> updateButton.setDisable(false)); }); // 删除 -- Gitee