【问题标题】:How to take an action on a deleted Asset in Adobe Experience Manager?如何在 Adob​​e Experience Manager 中对已删除的资产执行操作?
【发布时间】:2015-09-24 20:10:48
【问题描述】:

我有一个 Adob​​e Experience Manager 外部系统,每当在 AEM 中删除资产时,我都需要快速调用该系统。作为 AEM 专家,我的选择感觉非常有限。

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

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

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

【问题讨论】:

    标签: events adobe workflow aem


    【解决方案1】:

    基本上有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) 使用较低级别的 JCR API - 这是 JCR 实现提供的事件机制。这是持久性级别的最低级别的事件。作为一种好的做法,通常建议使用更高级别的 API,如 sling 或 Adob​​e 提供的 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,例如 sling。

    【讨论】:

    • 感谢您非常彻底的回复。我最终创建了一个 AEM 默认组件的叠加层,该组件调用了自定义 SlingServlet,部分按照您的建议。
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多