Go to file
guqing 5bc4a63e59
refactor: plugin development initializer (#3539)
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.4.x

#### What this PR does / why we need it:
去掉开发模式初始化器中加载插件的逻辑,以解决开发模式下启动插件时会遇到的问题
1. 重启插件/Halo启动时 PluginApplicationContext#hash has been closed already.
2. 卸载插件时 NullPointerException at pluginWrapper.getPlugin().stop() becuase 'pluginWrapper' is null
3. Halo 启动时 `Most likely this exception is thrown because the called constructor (xxx) cannot handle 'null' parameters. Original message was:  ...`
4. 以及启动插件后插件的 bean 没有被创建等
```shell
2023-03-20T13:28:02.811+08:00 ERROR 59170 --- [nReconciler-t-1] r.h.a.e.controller.DefaultController     : Reconciler in run.halo.app.core.extension.reconciler.PluginReconciler-worker-1 aborted with an error, re-enqueuing...

java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 10
	at java.base/java.util.ArrayList.fastRemove(ArrayList.java:642) ~[na:na]
	at java.base/java.util.ArrayList.remove(ArrayList.java:629) ~[na:na]
	at org.pf4j.AbstractPluginManager.resolvePlugins(AbstractPluginManager.java:797) ~[pf4j-3.9.0.jar:3.9.0]
	at org.pf4j.AbstractPluginManager.loadPlugin(AbstractPluginManager.java:204) ~[pf4j-3.9.0.jar:3.9.0]
	at run.halo.app.core.extension.reconciler.PluginReconciler.lambda$ensurePluginLoaded$17(PluginReconciler.java:495) ~[main/:na]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.ensurePluginLoaded(PluginReconciler.java:493) ~[main/:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.getPluginWrapper(PluginReconciler.java:322) ~[main/:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.lambda$readinessDetection$1(PluginReconciler.java:117) ~[main/:na]
	at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.readinessDetection(PluginReconciler.java:107) ~[main/:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.lambda$reconcile$0(PluginReconciler.java:95) ~[main/:na]
	at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.reconcile(PluginReconciler.java:87) ~[main/:na]
	at run.halo.app.core.extension.reconciler.PluginReconciler.reconcile(PluginReconciler.java:70) ~[main/:na]
	at run.halo.app.extension.controller.DefaultController$Worker.run(DefaultController.java:163) ~[main/:na]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
```
这些异常信息都是因为原先的 PluginManager 实现不是线程安全的,在 webflux 下使用并且有 Reconciler 的情况下非常容易复现。
所以除了在 Reconciler 调用以外尽量保证 PluginManager 的调用是单线程的,以避免 PluginManager 出现线程安全问题。

how to test it?
在开发模式下配置插件的 fixedPath 来检查差价启用功能是否正常。

#### Does this PR introduce a user-facing change?

```release-note
None
```
2023-03-20 10:06:26 +00:00
.github chore: remove issues triage action config files (#3503) 2023-03-13 11:58:17 +00:00
config/checkstyle chore: add checkstyle rule (#2091) 2022-05-17 06:46:11 +00:00
console chore: remove unused vars and imports to fix eslint warning (#3526) 2023-03-18 04:34:31 +00:00
docs Implement full-text search of posts with Lucene default (#2675) 2022-11-11 16:12:13 +00:00
gradle/wrapper Update Spring Boot to 3.0.4 (#3451) 2023-03-06 03:44:11 +00:00
hack chore: add cherry_pick_pull.sh for cherry-picking pull request (#1554) 2021-12-03 10:21:24 +08:00
src refactor: plugin development initializer (#3539) 2023-03-20 10:06:26 +00:00
.editorconfig refactor: next line config (#1844) 2022-04-14 07:49:17 +00:00
.gitattributes Refactor .gitignore 2019-04-03 11:37:59 +08:00
.gitignore Provide an endpoint to get plugin presets (#3394) 2023-02-28 10:26:18 +00:00
CODE_OF_CONDUCT.md docs: add CODE_OF_CONDUCT.md (#2150) 2022-06-12 08:10:12 +00:00
CONTRIBUTING.md chore: add cherry_pick_pull.sh for cherry-picking pull request (#1554) 2021-12-03 10:21:24 +08:00
Dockerfile Support command-line arguments running with Docker (#2942) 2022-12-14 15:12:22 +00:00
LICENSE Create LICENSE 2018-03-21 21:39:46 +08:00
OWNERS chore: add @LIlGG to reviewers list (#3292) 2023-02-13 01:48:18 +00:00
README.md docs: fix command of docker run (#3415) 2023-02-27 14:46:15 +00:00
SECURITY.md Update SECURITY.md 2021-09-29 20:43:15 +08:00
build.gradle Update Spring Boot to 3.0.4 (#3451) 2023-03-06 03:44:11 +00:00
gradle.properties Update Halo version to 2.4.0-SNAPSHOT (#3434) 2023-03-01 11:06:19 +00:00
gradlew Create basic project structure for halo 2.0 (#1699) 2022-03-04 15:04:11 +08:00
gradlew.bat Create basic project structure for halo 2.0 (#1699) 2022-03-04 15:04:11 +08:00
settings.gradle Bump Spring Boot to 3.0.0-RC1 (#2620) 2022-10-25 02:56:11 +00:00

README.md

Halo logo

Halo [ˈheɪloʊ],强大易用的开源建站工具。

GitHub release Docker pulls GitHub last commit GitHub Workflow Status Codecov percentage
官网 文档 社区 Gitee Telegram 频道


快速开始

docker run \
  -it -d \
  --name halo \
  -p 8090:8090 \
  -v ~/.halo2:/root/.halo2 \
  halohub/halo:2.2 \
  --halo.external-url=http://localhost:8090/ \
  --halo.security.initializer.superadminusername=admin \
  --halo.security.initializer.superadminpassword=P@88w0rd

以上仅作为体验使用,详细部署文档请查阅:https://docs.halo.run/getting-started/install/docker-compose

在线体验

生态

可访问 awesome-halo 查看已经适用于 Halo 2.0 的主题和插件,以及适用于 Halo 1.x 的相关仓库。

许可证

license

Halo 使用 GPL-v3.0 协议开源,请遵守开源协议。

贡献

参考 CONTRIBUTING

状态

Repobeats analytics