我正在尝试使用观察管理器实现事件监听器。我需要监听多个路径。
但是,我认为我们只能在一条路径上注册监听器。有没有办法可以监听多个路径?
我尝试过这样的事情
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/