基本上有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 或 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:
}
}
对于您的用例,我建议使用 Sling Eventing(选项 2)。除非真的有必要,或者您需要真正细粒度的访问,否则请始终坚持使用更高级别的 API,例如 sling。