2015-09-24 34 views
0

我有一个Adobe Experience Manager外部的系统,当AEM中的资产被删除时,我需要快速拨打电话。不是AEM的专家,我的选择感觉非常有限。如何对Adobe Experience Manager中的已删除资产执行操作?

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

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

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

回答

1

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

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

2)使用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,比如吊索或者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: 

    } 
} 

为您的使用情况下,我会建议使用吊索三项赛(选项2)。直到除非确实需要或者您需要非常精细的访问权限,否则始终坚持使用更高级别的API(如吊索)。

+1

谢谢你的非常彻底的回应。我最终创建了一个覆盖AEM的默认组件之一,这个组件调用了一个自定义的SlingServlet,部分正如您所建议的那样。 – therrin150

-1

这种情况下最好的解决方案是注册一个事件处理程序与适当的事件过滤器。

可以使用LDAP语法定义事件过滤器。 感谢这些过滤器,您的事件处理程序不会为每个已删除的资源而被解雇。

使用事件处理程序请注意apache felix中的超时属性。默认情况下,该属性设置为5秒。如果事件处理程序的执行时间超过这个时间,那么Apache Felix会将该事件放到黑名单中。 您可以在EventAdmin服务配置中更改该超时值, 也可以关闭特定事件的超时值。

+0

不幸的是,当我的事件处理程序被调用时,节点已经被删除,使我无法从该节点收集信息。在节点被实际删除之前,我必须找到一种方法将自己注入到删除过程中*。 – therrin150

+0

org/apache/sling/api/resource/Resource/REMOVED 您是否设置了这个主题? – loicram

+1

是的,我们按照[文档](https://helpx.adobe.com/experience-manager/using/events.html)中的描述非常详细地进行了操作,除了使用Event.NODE_REMOVED之外,显然以及我们自己的商业逻辑。事件处理程序收到节点的路径,但是当我们试图检索节点来收集我们的元数据时,我们得到了一个PathNotFoundException ... – therrin150

相关问题