从版本存储中删除已删除页面的版本AEM (JackRabbit)

问题描述 投票:0回答:1

我们的应用程序中有大量已删除的页面。但是,版本仍然存在于版本存储中。有什么办法可以删除吗

我尝试遍历 /jcr:system/jcr:versionStorage 并识别已删除的页面。但是,当我尝试删除该版本时,出现以下错误。

javax.jcr.nodetype.ConstraintViolationException:项目受保护。

此外,如果我尝试通过代码清除页面,由于存储库中存在大量已删除页面,我会收到基于错误的信息

(org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy) - 使用索引 cqParentPath 和过滤器 Filter(query=sele) 遍历 10000 个节点(31911 个索引条目) ct [jcr:path], [jcr:score], * 来自 [nt:version] 作为 a where isdescendantnode(a,

请帮忙,因为我真的被这个问题困扰了。

所以基本问题是,有没有办法删除包含 JackRabbit (AEM) 中已删除页面版本的节点

java aem jackrabbit
1个回答
0
投票

我意识到我回答这个问题已经晚了,但它仍然可能对以后遇到这个问题的人有所帮助。

可以从版本历史记录中删除版本(名为“jcr:rootVersion”的特殊版本除外),但无法通过常规 API 执行此操作。您需要使用 VersionManager API,如下所示:

Node node = session.getNode("/jcr:system/jcr:versionStorage/path/to/your/version/node");
Version version = (Version) node;
version.getContainingHistory().removeVersion(version.getName());
// Version removal is committed automatically, independently from Session.save() calls

没有用于删除完整版本历史记录的 API,而不是删除这些历史记录中的单个版本。我能找到的最好的解决方法是您自己找到的方法:将其中一个版本(最好是 jcr:rootVersion 因为它是最小的)恢复到某个路径,删除除 jcr:rootVersion 之外的所有版本,然后删除恢复的节点。 Oak 有一些内置功能可以清除已删除项目的历史记录,但前提是历史记录为空。您需要恢复然后删除一个版本才能触发它,但是“清空”历史记录本身不会触发它。

至于您提到的日志消息:这不是错误,只是警告。如果查询需要遍历超过 100,000 个节点,则会出现错误,此时您的查询将因异常而中止。如果您不会达到 100K 节点限制并且不担心实例过载,则可以忽略该警告。如果您确实达到 100K 限制,您有多种选择:

  • 创建一个新索引来支持您尝试运行的查询。仅当您计划定期运行查询时才建议这样做,一次性查询的开销不值得。
  • 将任务分成更小的块(例如,在更小的子树上运行查询并自己聚合结果)
  • 自己实现递归树遍历。可能比让查询引擎来做效率低一些,但是你自己的遍历代码并不局限于读取一定数量的节点。
© www.soinside.com 2019 - 2024. All rights reserved.