如何在 Adobe Experience Manager 中对已删除的资产执行操作?
How to take an action on a deleted Asset in Adobe Experience Manager?
我有一个 Adobe Experience Manager 外部系统,每当在 AEM 中删除资产时,我都需要快速调用该系统。不是 AEM 专家,我的选择非常有限。
我试图创建一个工作流,其中包含一个可以进行适当调用的步骤,并且连接了一个启动器来侦听来自 AEM 中特定路径的任何 "dam:Asset" 类型节点上的删除事件.这意味着我有一个 Java class 我已经推入了扩展 WorkflowProcess 的 AEM,并作为该工作流程的一部分被调用。
但是,当我去删除一个资产时,这个工作流没有被触发。但是,如果我更改 Launcher 以侦听 "Any Node Type" 上的 Remove 事件,工作流将按我预期的方式调用,但似乎资产在到达我的进程时已被删除,所以提供给我的进程的节点路径已经无效,我无法对其执行任何操作。无论如何,我不能让启动器设置为在 "Any Node Type"...
时启动
我错过了什么?有没有更好的方法来捕获资产上的删除事件?我所需要的只是能够从已删除的节点及其子节点收集一些信息来进行此外部调用。当用户删除资产时,我只需要节点上的句柄...
基本上有 3 种方法可以做到这一点:
1) 使用工作流程 - 您现在的工作方式。创建工作流并使用启动器来触发工作流。这种方法有其缺点。如果会有很多并发事件,那么您应该避免使用工作流,因为每个工作流都是一个独立的线程。如果有很多工作流程,那么您最终可能会遇到很多等待线程。
2) 使用 Sling Eventing - 这是 Sling 提供的事件机制。这是一个发布-订阅模型,您可以在这里订阅不同的主题,并在该主题的任何事件发生时收到通知。有不同的主题,例如 "RESOURCE_ADDED"、"RESOURCE_REMOVED" 等
这是一个示例代码,说明如何创建一个侦听器,该侦听器会在资源被删除时收到通知。
public class AssetRemoved implements EventHandler {
private Logger logger = LoggerFactory.getLogger(AssetRemoved.class);
@Override
public void handleEvent(Event event) {
logger.info("********Node removed");
String[] propertyNames = event.getPropertyNames();
}
}
3) using Lower level JCR API's - 这是 JCR 实现提供的事件机制。这是持久性级别的最低级别的事件处理。作为一个很好的实践,通常建议使用更高级别的 API 之类的吊索或 Adobe 提供的吊索作为一般规则。
在 JCR 事件机制中,您创建一个观察侦听器,它会收到通知
http://www.day.com/specs/jsr170/javadocs/jcr-1.0/javax/jcr/observation/EventListener.html
可能会发生 6 种类型的事件:
已添加节点
节点移动
节点已删除
添加的属性
财产已删除
属性已更改
您的事件侦听器会收到所有事件的通知,您必须根据要侦听的类型进行过滤(与 Sling 事件不同)。
您可以像下面的示例代码一样创建一个事件侦听器:
Public class SampleEventListener implements EventListener{
pubic void onEvent(EventIterator events){
//filter the type of event type & do your stuff here:
}
}
对于您的用例,我建议使用 Sling Eventing(选项 2)。除非真的有必要,或者您需要非常精细的访问,否则请始终坚持使用更高级别的 API 之类的 sling。
我有一个 Adobe Experience Manager 外部系统,每当在 AEM 中删除资产时,我都需要快速调用该系统。不是 AEM 专家,我的选择非常有限。
我试图创建一个工作流,其中包含一个可以进行适当调用的步骤,并且连接了一个启动器来侦听来自 AEM 中特定路径的任何 "dam:Asset" 类型节点上的删除事件.这意味着我有一个 Java class 我已经推入了扩展 WorkflowProcess 的 AEM,并作为该工作流程的一部分被调用。
但是,当我去删除一个资产时,这个工作流没有被触发。但是,如果我更改 Launcher 以侦听 "Any Node Type" 上的 Remove 事件,工作流将按我预期的方式调用,但似乎资产在到达我的进程时已被删除,所以提供给我的进程的节点路径已经无效,我无法对其执行任何操作。无论如何,我不能让启动器设置为在 "Any Node Type"...
时启动我错过了什么?有没有更好的方法来捕获资产上的删除事件?我所需要的只是能够从已删除的节点及其子节点收集一些信息来进行此外部调用。当用户删除资产时,我只需要节点上的句柄...
基本上有 3 种方法可以做到这一点:
1) 使用工作流程 - 您现在的工作方式。创建工作流并使用启动器来触发工作流。这种方法有其缺点。如果会有很多并发事件,那么您应该避免使用工作流,因为每个工作流都是一个独立的线程。如果有很多工作流程,那么您最终可能会遇到很多等待线程。
2) 使用 Sling Eventing - 这是 Sling 提供的事件机制。这是一个发布-订阅模型,您可以在这里订阅不同的主题,并在该主题的任何事件发生时收到通知。有不同的主题,例如 "RESOURCE_ADDED"、"RESOURCE_REMOVED" 等
这是一个示例代码,说明如何创建一个侦听器,该侦听器会在资源被删除时收到通知。
public class AssetRemoved implements EventHandler {
private Logger logger = LoggerFactory.getLogger(AssetRemoved.class);
@Override
public void handleEvent(Event event) {
logger.info("********Node removed");
String[] propertyNames = event.getPropertyNames();
}
}
3) using Lower level JCR API's - 这是 JCR 实现提供的事件机制。这是持久性级别的最低级别的事件处理。作为一个很好的实践,通常建议使用更高级别的 API 之类的吊索或 Adobe 提供的吊索作为一般规则。
在 JCR 事件机制中,您创建一个观察侦听器,它会收到通知
http://www.day.com/specs/jsr170/javadocs/jcr-1.0/javax/jcr/observation/EventListener.html
可能会发生 6 种类型的事件:
已添加节点 节点移动 节点已删除 添加的属性 财产已删除 属性已更改
您的事件侦听器会收到所有事件的通知,您必须根据要侦听的类型进行过滤(与 Sling 事件不同)。
您可以像下面的示例代码一样创建一个事件侦听器:
Public class SampleEventListener implements EventListener{
pubic void onEvent(EventIterator events){
//filter the type of event type & do your stuff here:
}
}
对于您的用例,我建议使用 Sling Eventing(选项 2)。除非真的有必要,或者您需要非常精细的访问,否则请始终坚持使用更高级别的 API 之类的 sling。