基本上有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(如吊索)。
謝謝你的非常徹底的迴應。我最終創建了一個覆蓋AEM的默認組件之一,這個組件調用了一個自定義的SlingServlet,部分正如您所建議的那樣。 – therrin150