JCR event listener is not working in aem 6.4 | Community
Skip to main content
New Participant
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

smacdonald2008
New Participant
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);

smacdonald2008
New Participant
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
New Participant
November 2, 2018

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

arunpatidar
New Participant
November 2, 2018

Hi,

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

Arun Patidar
Peter_Puzanovs
New Participant
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