多个路径上的 aem cq 监听器

标签 aem event-listener sling

我正在尝试使用观察管理器实现事件监听器。我需要监听多个路径。

但是,我认为我们只能在一条路径上注册监听器。有没有办法可以监听多个路径?

我尝试过这样的事情

String pathvalues = "path1,path2,path3";
List < String > path = Arrays.asList(pathvalues.split(","));
session = repository.loginAdministrative(repository.getDefaultWorkspace());
observationManager = session.getWorkspace().getObservationManager();
for (String paths: path) {
 observationManager.addEventListener(this, Event.NODE_ADDED, paths, true, null, null, false);
}

但这只是监听它迭代的最后一条路径。我想这是有道理的,所以我仍然被困住了。

我在网上找到了这个, SLING-4564

我实现了它,但不知何故它仍然没有听。

如果有人有任何意见,请告诉我。

最佳答案

对于您的第一期:

observationManager.addEventListener(this, Event.NODE_ADDED, paths, true, null, null, false);

But this is listening on only the last path it has iterated on

这是设计使然。偶数监听器仅注册到一个路径,循环中提供的最后一个路径将是事件路径。最后一次调用 addEventListener 之前的所有其他内容都将被忽略。

您的问题有两种可能的解决方案:

在父级注册您的监听器并在调用时过滤事件。

或者

使用 eventFilter.setAdditionalPaths(paths); 过滤多个路径上的事件,如 SLING-4564 中所述

第一种方法更可取,因为它允许您根据您的逻辑实现最佳且快速的过滤。例如,您的快速过滤器可以排除/etc/,以便您可以轻松评估事件路径并检查它是否以/etc/开头并丢弃它。

SLING-4564 基本上是为大型事件(例如 OAK 启动)而设计的,并且作为性能的一般准则,您的应用程序特定事件监听器应仅限于应用程序或内容特定路径,而不是本质上是全局的。

关于多个路径上的 aem cq 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140784/

相关文章:

java - AEM Sling 资源解析器映射方法

java - CQ5 - 如何获取页面图片

AEM:错误日志

extjs - 切换对话框中一组字段的可见性

android webview - 剪贴板更改时更改剪贴板数据

javascript - 在不重新刷新页面的情况下使用 ES6 时,事件监听器不会重新附加到我的 HTML 元素

aem - Sling resource.getResourceResolver() 与 SlingHttpRequest.getResourceResolver

java - 处理单个 CQ 组件后获取 HTML 输出

javascript - 将 JS 事件监听器添加到 Chrome 扩展弹出窗口

java - Apache Sling 停止响应请求