捕获AEM内容安装事件

时间:2018-04-04 14:19:25

标签: aem cq5

此处的用例是获取内容信息,其类型为cq:Page和dam:使用AEM中的包管理器在JCR中安装/更新的资产。

我想知道是否有任何可用于此目的的事件监听器或API。

有没有办法知道是否使用包管理器安装/更新了内容?

此处正在使用AEM 6.2。

谢谢!

1 个答案:

答案 0 :(得分:2)

要检测资源更改,您需要创建ResourceChangeListener

以下是基于ACS公共SampleResourceChangeListener但仅限于<x> <y> <width> <height>ADDED事件的示例。

CHANGED

或者,你可以使用import org.apache.felix.scr.annotations.*; import org.apache.sling.api.resource.observation.ExternalResourceChangeListener; import org.apache.sling.api.resource.observation.ResourceChange; import org.apache.sling.api.resource.observation.ResourceChangeListener; import org.apache.sling.event.jobs.JobManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; import java.util.HashMap; import java.util.List; import java.util.Map; /** * The Sling Resource Change Listener is the preferred method for listening for Resource Change events in AEM. * This is preferred over the Sling Resource Event Listener, or the JCR Event Handler approaches. * * ResourceChangeListener Javadoc: * - https://docs.adobe.com/docs/en/aem/6-2/develop/ref/javadoc/org/apache/sling/api/resource/observation/ResourceChangeListener.html * * Note: To listen for External events, implements the ExternalResourceChangeListener. If ONLY local events are in scope, implement only the ResourceChangeListener. */ @Component( label = "Sample - Resource Change Listener", description = "A sample implementation of the Sling Resource Change Listener", metatype = true ) @Properties({ // Scope the paths as tightly as possible based on your use-case. @Property( label = "Paths", description = "[ Required ] A list of resource paths this listener will listen for change events.", name = ResourceChangeListener.PATHS, value = {"/content"} ), // Scope the types as tightly as possible based on your use-case. // If This property is not provided, ALL ChangeTypes will be accepted. // Available values are defined on: ResourceChange.ChangeType @Property( label = "Change Types", description = "[ Optional ] The change event types this listener will listener for. ", name = ResourceChangeListener.CHANGES, value = {"ADDED", "CHANGED"} ) }) @Service public class SampleResourceChangeListener implements ResourceChangeListener, ExternalResourceChangeListener { private static final Logger log = LoggerFactory.getLogger(SampleResourceChangeListener.class); @Reference private JobManager jobManager; public void onChange(@Nonnull List<ResourceChange> changes) { // Iterate over the ResourceChanges and process them for (final ResourceChange change : changes) { // Process each change quickly; Do not do long-running work in the Resource Change Listener. // If expensive/long-running work is required to handle the event, create a Sling Job to perform that work. if (change.isExternal()) { // Since this implements BOTH the ResourceChangeListener AND ExternalResourceChangeListener // we can conditionally handle local vs external events. } switch (change.getType()) { case ADDED: log.debug("Change Type ADDED: {}", change); if (change.getAddedPropertyNames().contains("someProperty")) { // Do some work // In this case we will pass some some data from the Event to a custom job via a custom Job topic. final Map<String, Object> props = new HashMap<String, Object>(); props.put("path", change.getPath()); props.put("userId", change.getUserId()); jobManager.addJob("com/adobe/acs/commons/samples/somePropertyAdded", props); } break; case CHANGED: log.debug("Change Type CHANGED: {}", change); if (change.getChangedPropertyNames().contains("someOtherProperty")) { // Do some other work } break; default: // Do nothing } } } } ,ACS在这里有一个很好的例子:SampleJcrEventListener.java

我不知道如何检测添加/更新的原因是否为包管理器。但是,如果要在安装软件包之前执行某些代码,可以使用InstallHook。我以前没试过这个。