3

当某些 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")
  }
 }
}

现在,当我激活页面时,此处理程序会做出反应并记录字符串“测试事件处理程序”。现在,当我第二次或第三次激活页面时,事件处理程序没有反应。我必须从 Felix 控制台重新启动 Service ExampleEventHandler,以便它再次做出反应(一次)。

如何配置事件处理程序(或ReplicationAction),以便ExampleEventHandler每次都做出反应,当页面被激活而无需每次都重新启动Service ExampleEventHandler?

4

2 回答 2

2

我已经在我的 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;
    }
}
于 2013-10-10T06:59:26.790 回答
1

或者在 felix 控制台中,您可以将包命名空间“com.yourpackage*”添加到包的白名单列表中。这将确保包中的事件处理程序永远不会被事件管理服务列入黑名单。

于 2013-10-10T17:00:25.473 回答