如何在Adobe Experience Manager中对已删除的资产执行操作?

时间:2015-09-24 20:10:49

标签: events adobe workflow aem

我有一个Adobe Experience Manager外部系统,我需要在AEM中删除资产时快速调用。不是AEM的专家,我的选择非常有限。

我尝试创建一个工作流程,其中包含一个可以进行相应调用的步骤,并且已连接一个启动器,以便在AEM中的某个路径上侦听任何“dam:Asset”类型节点上的Remove事件。这意味着我有一个Java类,我已经推入了扩展WorkflowProcess的AEM,并被称为该工作流的一部分。

但是,当我删除资产时,不会触发此工作流程。但是,如果我更改Launcher以侦听“任何节点类型”上的删除事件,则会按照我的预期调用工作流,但是当资产在到达我的进程时已经被删除了,所以提供给我的进程的节点路径已经无效,我无法对它做任何事情。在任何情况下,我都不能让Launcher设置为“任何节点类型”......

我错过了什么?有没有更好的方法来捕获资产上的删除事件?我只需要能够从已删除的节点及其子节点收集一些信息来进行外部呼叫。当用户删除资产时,我只需要在节点上有句柄...

1 个答案:

答案 0 :(得分:1)

基本上有3种方法可以做到这一点:

1)使用工作流程 - 您现在正在采用的方式。创建工作流并使用启动器来触发工作流。这种方法有其缺点。如果有很多并发事件,那么你应该避免使用工作流,因为每个工作流都是一个独立的线程。如果有很多工作流程,那么你最终可能会有很多等待线程。

2)使用Sling Eventing - 这是吊索提供的事件机制。这是一个发布 - 订阅模型在这里,您可以订阅不同的主题,并在发生该主题的任何事件时收到通知。有不同的主题,如“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)使用低级JCR API - 这是JCR实现提供的事件机制。这是持久性级别的最低事件级别。作为一个很好的实践,总是建议使用更高级别的API,如吊索或Adobe提供的API作为一般规则。

在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,比如吊索。