활동이 없어 이 대화는 잠겼습니다. 새 게시물을 작성해 주세요.
활동이 없어 이 대화는 잠겼습니다. 새 게시물을 작성해 주세요.
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
Exactly - this is where the issue is. I will test this on 6.4.
조회 수
답글
좋아요 수
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.
조회 수
답글
좋아요 수
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);
조회 수
답글
좋아요 수
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.
조회 수
답글
좋아요 수
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
조회 수
답글
좋아요 수
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.
조회 수
답글
좋아요 수
조회 수
답글
좋아요 수
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);
}
}
}
조회 수
답글
좋아요 수
HI @karthick1356
Which AEM version are you using?
조회 수
답글
좋아요 수