当页面被激活时,sling eventhandler只响应一次

时间:2013-10-09 21:15:46

标签: java event-handling cq5 sling

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

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

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