基本上有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