2015-09-24 33 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

相關問題