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?
Solved! Go to Solution.
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"); | |
} |
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
Hi,
Are creating your own listeners, if yes, how you are getting session?
Exactly - this is where the issue is. I will test this on 6.4.
Views
Replies
Total Likes
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.
Views
Replies
Total Likes
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);
Views
Replies
Total Likes
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.
I'm getting via subservice and a system user, the usual way.
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);
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"); | |
} |
that is great! We will create a 6.4 HELXP article and show this code.
Views
Replies
Total Likes
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
Views
Replies
Total Likes
this solution is not working for 6.5
Hi,
What error are you getting? Is bundle active?
not getting any error. bundle is also active, eventlistner not working. it worked with administrativelogin.but not with servicelogin
It's 2021 Same problem on Cloud AEM when switched to version 2021.3.5087.20210322T071003Z. On version: AEM v2021.1.4794.20210121T150042Z. it was working fine.
Views
Replies
Total Likes
Views
Replies
Total Likes
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
onEvent method never triggered for me. is it still working for you?
bcz I followed the same from here:aem63app-repo/SampleJCREvent.java at master · arunpatidar02/aem63app-repo · GitHub.
I saw the log event that get registered and unregistered.
public void onEvent(EventIterator it) {
while (it.hasNext()) {
Event event = it.nextEvent();
try {
logger.info("********INSIDE TRY *****");
Property changedProperty = session.getProperty(event.getPath());
if (changedProperty.getName().equalsIgnoreCase("jcr:title")
&& !changedProperty.getString().endsWith("!")) {
changedProperty.setValue(changedProperty.getString() + "!");
logger.info("*************Property updated: {}", event.getPath());
session.save();
}
}
catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
Views
Replies
Total Likes
HI @karthick1356
Which AEM version are you using?
Views
Replies
Total Likes
Hi @arunpatidar , AEM version is 6.5.13.
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies