JCR event listener is not working in aem 6.4

Avatar

Avatar

vitis90

Avatar

vitis90

vitis90

02-11-2018

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?

Accepted Solutions (1)

Accepted Solutions (1)

Avatar

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883
Arun_Patidar
MVP

03-11-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");
}

Answers (14)

Answers (14)

Avatar

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883
Arun_Patidar
MVP

29-05-2019

Hi,

I've just checked below example in 6.5, working fine for me.

I created a system user arch17sysuser, gave CRUD permissions, created mapping with sub service readService

mapping look like below where com.acc.arch17.arch17.core is bundle symbolic name.

com.acc.arch17.arch17.core:readService=arch17sysuser

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

Avatar

Avatar

ajinkayk6258253

Avatar

ajinkayk6258253

ajinkayk6258253

29-05-2019

not getting any error. bundle is also active, eventlistner not working. it worked with administrativelogin.but not with servicelogin

Avatar

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883
Arun_Patidar
MVP

29-05-2019

Hi,

What error are you getting? Is bundle active?

Avatar

Avatar

ajinkayk6258253

Avatar

ajinkayk6258253

ajinkayk6258253

29-05-2019

this solution is not  working for 6.5

Avatar

Avatar

vitis90

Avatar

vitis90

vitis90

02-11-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);

Avatar

Avatar

vitis90

Avatar

vitis90

vitis90

02-11-2018

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

Avatar

Avatar

vitis90

Avatar

vitis90

vitis90

02-11-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.

Avatar

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883

Avatar

Arun_Patidar

MVP

Total Posts

3.1K

Likes

1.2K

Correct Reply

883
Arun_Patidar
MVP

02-11-2018

Hi,

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

Avatar

Avatar

PuzanovsP

MVP

Avatar

PuzanovsP

MVP

PuzanovsP
MVP

02-11-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

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K
smacdonald2008

03-11-2018

Confirmed this output was created:  com.adobe.community.listeners.SimpleResourceListener something has been added : /apps/example/config

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.loginService("datawrite",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);

      }

     }

    }

6.4 article  -- https://helpx.adobe.com/experience-manager/using/aem64_event_listener.html

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K
smacdonald2008

03-11-2018

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

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K
smacdonald2008

02-11-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);

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K
smacdonald2008

02-11-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.

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Reply

2.3K
smacdonald2008

02-11-2018

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