[halo-dev/halo]针对于halo2开发了一个插件,但是如果文章过多,报错

2024-04-02 28 views
3
是什么版本出现了此问题?

2.6

使用的什么数据库?

MySQL 8.x

使用的哪种方式部署?

Docker

发生了什么?

问题描述:开发了一个新插件,插件代码如下图,遇到的问题是在本地测试能够正常跑通,发布到线上后,出现如下报错信息,我怀疑是线上的文章数量太多,查询的时候被阻塞了,不知道是不是,希望作者指点一下。

针对于新需求,根据子分类名称找到父类到子类路径上所有节点,新增的函数 截图_20230703095353 截图_20230703095402

主程序报错信息 截图_20230703095025

回答

6

Hi @pandatools , thanks for reaching out here!

方便讲插件提交到仓库后分享出来我们复现一下么?

0

你可以先参考下面的实现方式来修改代码:

CategoryTreeVo createVirtualRoot(List<CategoryTreeVo> categoryTrees) {
        return CategoryTreeVo.builder()
            .spec(new Category.CategorySpec())
            .status(new Category.CategoryStatus())
            .metadata(new Metadata())
            .children(categoryTrees)
            .build();
    }

    public boolean findNodePath(CategoryTreeVo root, String nodeToFind, List<String> result) {
        if (root == null) {
            return false;
        }
        if (StringUtils.equals(root.getMetadata().getName(), nodeToFind)) {
            result.add(root.getMetadata().getName());
            return true;
        }
        for (CategoryTreeVo child : root.getChildren()) {
            if (findNodePath(child, nodeToFind, result)) {
                result.add(root.getMetadata().getName());
                return true;
            }
        }
        return false;
    }

使用示例

// 将 listToTree 的返回结果作为参数传入
CategoryTreeVo virtualRoot = createVirtualRoot(treeVos);
List<String> result = new ArrayList<>();
findNodePath(virtualRoot, "ed064d5e-2b6f-4123-8114-78d0c6f2c4e2", result);

在写的时候可能需要注意以下几点:

  1. 不要在方法体中使用 block 有关的几个操作符,它是阻塞的不能在非阻塞的线程中调用
  2. 不要将 Mono 或者 Flux 作为方法的参数
2

我刚才发现,不只是我写的这个接口有问题,项目原生的接口也存在相同的问题,比如postFinder.listAll(),这个是查询所有文章的,我系统里有30多个文章,然后我按每两到三秒一次的频率触发这个方法,一样能造成这个报错,请问这个有啥解决方案吗,是不是频繁的查询会造成系统的堵塞

7

不是没有这个可能。目前我们使用的 R2DBC MySQL 驱动 https://github.com/asyncer-io/r2dbc-mysql 可能不是很稳定,不排除这种可能。如果能够提供一个稳定的复现步骤就更好了,这样方便我向上游提交 Issue 来修复这个问题。