当某些 cq5 页面被激活时,我使用以下代码来记录一些信息。
@Component
@Service
@Property(name="event.topics",value= {ReplicationAction.EVENT_TOPIC})
public class ExampleEventHandler implements EventHandler {
Logger log = LoggerFactory.getLogger(this.getClass());
public void handleEvent(Event event) {
ReplicationAction action = ReplicationAction.fromEvent(event);
if(action.getType().equals(ReplicationActionType.ACTIVATE)){
log.info("test Event handler")
}
}
}
现在,当我激活页面时,该处理程序会使用react并记录字符串“test Event handler”。现在,当我第二次或第三次激活页面时,事件处理程序不会使用react。我必须从 Felix 控制台重新启动 Service ExampleEventHandler,以便它再次使用react(一次)。
如何配置事件处理程序(或ReplicationAction),使得ExampleEventHandler每次在页面激活时都会使用react,而不需要每次都重新启动ExampleEventHandler服务?
最佳答案
我已在我的 CQ5 实例中安装了您的组件,并且每次都运行得很好。但是,如果您在事件处理程序中执行一些复杂、耗时的操作(而不是简单地记录事件),则可能会被 Apache Felix Event Admin 禁止。 。默认情况下,如果您的 handleEvent()
运行时间超过 5 秒,就会发生这种情况。
在这种情况下,您应该使用 JobUtil.processJob()
方法将事件传递给 JobProcessor
:
@Component
@Service(value = EventHandler.class)
@Property(name = EventConstants.EVENT_TOPIC, value = { ReplicationAction.EVENT_TOPIC })
public class Test implements EventHandler, JobProcessor {
private static final Logger LOG = LoggerFactory.getLogger(Test.class);
@Override
public void handleEvent(Event event) {
ReplicationAction action = ReplicationAction.fromEvent(event);
if (action.getType().equals(ReplicationActionType.ACTIVATE)) {
JobUtil.processJob(event, this);
}
}
@Override
public boolean process(Event job) {
LOG.info("Do some complex logic here");
return true;
}
}
关于java - 激活页面时,sling 事件处理程序仅响应一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19282896/