JCR event listener is not working in aem 6.4 | Community
Skip to main content
Level 3
November 2, 2018
Solved

JCR event listener is not working in aem 6.4

  • November 2, 2018
  • 15 replies
  • 12115 views

Hi all,

Looks like the JCR event listener in 6.4 is broken. Events dont get triggered at all. Is anyone else facing the same issue? Is there any solution?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by arunpatidar

Hi Scott,

It does work with system user as well. But you need JCR repository session in order to get jcr events work.

Below code works for me.

aem63app-repo/SampleJCREvent.java at master · arunpatidar02/aem63app-repo · GitHub

@Reference
private SlingRepository repository;
private Session session;
private ObservationManager observationManager;
protected void activate(ComponentContext context) throws Exception {
session = repository.loginService("readService",null);
observationManager = session.getWorkspace().getObservationManager();
observationManager.addEventListener(this, Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/content/AEM64App/fr", true, null,
new String[]{"cq:PageContent","nt:unstructured"} , true);
logger.info("*************added JCR event listener");
}

15 replies

Peter_Puzanovs
Community Advisor
Community Advisor
November 2, 2018

Dear Sir or Madam,

That's impossible, if your AEM system managed to install it means that JCR Event Listener has been working(or worked).

Would it be possible that any of your code has broken Listener or your code incorrectly hooks into Listeners?

Regards,

Peter

arunpatidar
Community Advisor
Community Advisor
November 2, 2018

Hi,

Are creating your own listeners, if yes, how you are getting session?

Arun Patidar
smacdonald2008
Level 10
November 2, 2018

Exactly - this is where the issue is. I will test this on 6.4.

smacdonald2008
Level 10
November 2, 2018

I got this working with the following code. The result was this - which shows the logic working: 

02.11.2018 11:08:47.895 *INFO* [sling-oak-observation-19] SimpleResourceListener something has been added : /apps/example/templates

02.11.2018 11:08:47.895 *INFO* [sling-oak-observation-19] SimpleResourceListener something has been added : /apps/example/templates/jcr:primaryType

02.11.2018 11:08:47.895 *INFO* [sling-oak-observation-19] SimpleResourceListener something has been added : /apps/example/templates/jcr:createdBy

02.11.2018 11:08:47.895 *INFO* [sling-oak-observation-19] SimpleResourceListener something has been added : /apps/example/templates/jcr:created

Java code:

package com.adobe.community.listeners;

import java.util.HashMap;

import java.util.Map;

import javax.jcr.Property;

import javax.jcr.RepositoryException;

import javax.jcr.Session;

import javax.jcr.observation.Event;

import javax.jcr.observation.EventListener;

import javax.jcr.observation.ObservationManager;

import org.apache.sling.api.resource.LoginException;

import org.apache.sling.api.resource.Resource;

import org.apache.sling.api.resource.ResourceResolver;

import org.apache.sling.api.resource.ResourceResolverFactory;

import org.osgi.service.component.annotations.Activate;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.component.annotations.Deactivate;

import org.osgi.service.component.annotations.Modified;

import org.osgi.service.component.annotations.Reference;

import org.osgi.service.metatype.annotations.Designate;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.osgi.service.component.ComponentContext;

import javax.jcr.observation.EventIterator ;

 

@Component(immediate=true,

service= EventListener.class)

public class SimpleResourceListener implements EventListener{

 

    Logger log = LoggerFactory.getLogger(this.getClass());

     private Session adminSession;

     

     @Reference

     org.apache.sling.jcr.api.SlingRepository repository;

     

     @Activate

     public void activate(ComponentContext context) throws Exception {

     log.info("activating ExampleObservation");

     try {

       adminSession = repository.loginAdministrative(null);

       adminSession.getWorkspace().getObservationManager().addEventListener(

          this, //handler

          Event.PROPERTY_ADDED|Event.NODE_ADDED, //binary combination of event types

          "/apps/example", //path

          true, //is Deep?

          null, //uuids filter

          null, //nodetypes filter

          false);

      } catch (RepositoryException e){

      log.error("unable to register session",e);

      throw new Exception(e);

     }

    }

    @Deactivate

    public void deactivate(){

     if (adminSession != null){

      adminSession.logout();

     }

    }

     

    public void onEvent(EventIterator eventIterator) {

      try {

        while (eventIterator.hasNext()){

          log.info("something has been added : {}", eventIterator.nextEvent().getPath());

        }

       } catch(RepositoryException e){

       log.error("Error while treating events",e);

      }

     }

    }

I tried replacing use of login with a system user - that did not fire the event. So I whitelisted the bundle and this works. Try that.

smacdonald2008
Level 10
November 2, 2018

Tested again - this session (even though system user belongs to admin group and has all required permissions) does not fire off the event:

Map<String, Object> param = new HashMap<String, Object>();

        param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");

        ResourceResolver resolver = null;

          

        try {

                     

            //Invoke the adaptTo method to create a Session used to create a QueryManager

            resolver = resolverFactory.getServiceResourceResolver(param);

            session = resolver.adaptTo(Session.class);

vitis90Author
Level 3
November 2, 2018

Hi Scott,

I'm actually getting a session object in this way, using the subservice and system user. It is the recommended way right? Is there any workaround for this? I wouldn't want to get the session by passing null object because it is not the secure way.

vitis90Author
Level 3
November 2, 2018

I'm getting via subservice and a system user, the usual way.

vitis90Author
Level 3
November 2, 2018

hi Scott, even this code didn't work

adminSession = repository.loginAdministrative(null);

observationManager = adminSession.getWorkspace().getObservationManager();

observationManager.addEventListener(this, Event.NODE_ADDED | Event.NODE_MOVED | Event.NODE_REMOVED, "/content/dam/products",true, null, null, false);

arunpatidar
Community Advisor
arunpatidarCommunity AdvisorAccepted solution
Community Advisor
November 3, 2018

Hi Scott,

It does work with system user as well. But you need JCR repository session in order to get jcr events work.

Below code works for me.

aem63app-repo/SampleJCREvent.java at master · arunpatidar02/aem63app-repo · GitHub

@Reference
private SlingRepository repository;
private Session session;
private ObservationManager observationManager;
protected void activate(ComponentContext context) throws Exception {
session = repository.loginService("readService",null);
observationManager = session.getWorkspace().getObservationManager();
observationManager.addEventListener(this, Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/content/AEM64App/fr", true, null,
new String[]{"cq:PageContent","nt:unstructured"} , true);
logger.info("*************added JCR event listener");
}
Arun Patidar
smacdonald2008
Level 10
November 3, 2018

that is great! We will create a 6.4 HELXP article and show this code.