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")
  }
 }
}

Теперь, когда я активирую страницу, этот обработчик реагирует и регистрирует строку «тестовый обработчик событий». Теперь, когда я активирую страницу второй или третий раз, обработчик событий не реагирует. Мне нужно перезапустить Service ExampleEventHandler из консоли Felix, чтобы он снова отреагировал (один раз).

Как настроить обработчик событий (или ReplicationAction), чтобы ExampleEventHandler реагировал каждый раз, когда страница активируется без необходимости перезапуска службы ExampleEventHandler каждый раз?


person Max_Salah    schedule 09.10.2013    source источник


Ответы (2)


Я установил ваш компонент в свой экземпляр CQ5, и он каждый раз отлично работает. Однако, если вы выполняете какие-то сложные и трудоемкие действия в своем обработчике событий (вместо того, чтобы просто регистрировать события), он может быть забанен Администратор событий Apache Felix. По умолчанию это произойдет, если ваш 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;
    }
}
person Tomek Rękawek    schedule 10.10.2013

Или в консоли felix вы можете добавить пространство имен вашего пакета «com.yourpackage*» в белый список пакетов. Это гарантирует, что обработчики событий в вашем пакете никогда не будут занесены в черный список службой администрирования событий.

person Abhinav    schedule 10.10.2013
comment
Обратите внимание, что добавление в белый список долго выполняющихся обработчиков событий — это простой способ снизить производительность инстанса CQ5. JobProcessor — это рекомендуемый простой способ решения таких проблем. - person Tomek Rękawek; 11.10.2013