mirror of https://github.com/halo-dev/halo
![]() #### 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 ``` |
||
---|---|---|
.github | ||
config/checkstyle | ||
console | ||
docs | ||
gradle/wrapper | ||
hack | ||
src | ||
.editorconfig | ||
.gitattributes | ||
.gitignore | ||
CODE_OF_CONDUCT.md | ||
CONTRIBUTING.md | ||
Dockerfile | ||
LICENSE | ||
OWNERS | ||
README.md | ||
SECURITY.md | ||
build.gradle | ||
gradle.properties | ||
gradlew | ||
gradlew.bat | ||
settings.gradle |
README.md
Halo [ˈheɪloʊ],强大易用的开源建站工具。
快速开始
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
在线体验
- 环境地址:https://demo.halo.run
- 后台地址:https://demo.halo.run/console
- 用户名:
demo
- 密码:
P@ssw0rd123..
生态
可访问 awesome-halo 查看已经适用于 Halo 2.0 的主题和插件,以及适用于 Halo 1.x 的相关仓库。
许可证
Halo 使用 GPL-v3.0 协议开源,请遵守开源协议。
贡献
参考 CONTRIBUTING。