Adobe CQ: относительно сеанса в прослушивателе событий

У меня вопрос относительно прослушивателя событий. У нас есть прослушиватель событий, который прослушивает событие удаления узла и выполняет некоторые действия, например, «отправить электронное письмо».

Во время проверки кода я обнаружил это, хотя этот код работает нормально, я не уверен, что сеанс обрабатывается здесь:

@Activate
protected void activate(ComponentContext context) {
try{
        final String path="/content/dam/";
       Session session = repository.loginAdministrative(repository.getDefaultWorkspace());
        observationManager = session.getWorkspace().getObservationManager();
        observationManager.addEventListener(this, Event.PROPERTY_REMOVED, path, true, null, null, true);
        checkOutProperty = OsgiUtil.toString(context.getProperties()
                .get(ASSET_LOCK_PROPNAME_UPDATE), ASSET_LOCK_PROPNAME_DEFAULT);
        if (session != null && session.isLive()) {
                session.save();
       }
    } catch (RepositoryException e) {
        if(LOG.isErrorEnabled()){
            LOG.error("Error Occured in activate method of Property Removed Listener class:" + e.getMessage());
        }
    }catch (Exception e) {
        if(LOG.isErrorEnabled()){
            LOG.error("Error Occured in activate method of Property Removed Listener class:"+e.getMessage());
        }
    }

}



@Deactivate
protected void deactivate(ComponentContext componentContext) {
    try {
        if (observationManager != null) {
            observationManager.removeEventListener(this);
        }
    } catch (RepositoryException e) {
        if(LOG.isErrorEnabled()){
            LOG.error("Error Occured " + e);
        }
    } catch (Exception e) {
        if(LOG.isErrorEnabled()){
            LOG.error(e.getMessage());
        }
    }
}

Вопросы:

  • Лучшей практикой было бы создать объект сеанса, закрытый для этого класса, и должен ли он выйти из системы в методе деактивации?
  • Когда событие добавлено в Observation Manager, действительно ли нам нужен объект сеанса? Я ожидал, что мы должны выйти из сеанса там.

person Community    schedule 17.12.2014    source источник


Ответы (1)


EventListener здесь немного громоздкий. Я участвовал во многих битвах с JCR Sessions и Sling ResourceResolvers внутри них. Проблема в том, что вам нужно поддерживать сеанс активным, пока активен прослушиватель событий. Таким образом, единственное, чего не хватает в вашем коде, — это выход из системы при деактивации.

Я создал AbstractEventListener, который позаботится об этом и предоставляет следующие два метода и имеет два закрытых члена:

private Session session;
private ObservationManager observationManager;

protected void addEventListener(final EventListener eventListener,
        final int eventTypes, final String path, final String[] nodeTypes) {
    try {
        session = getRepositorySession();
        observationManager = session.getWorkspace().getObservationManager();
        observationManager.addEventListener(eventListener, eventTypes,
                path, true, null, nodeTypes, true);
    } catch (RepositoryException e) {
        LOGGER.error("Repository error while registering observation: ", e);
    }
}

protected void removeEventListener(final EventListener eventListener) {
    if (observationManager != null) {
        try {
            observationManager.removeEventListener(eventListener);
        } catch (RepositoryException e) {
            LOGGER.error(
                    "Repository error while unregistering observation: ", e);
        } finally {
            logoutSession(session);
        }
    }
}

А затем в реальном EventListener я просто вызываю их:

protected void activate(ComponentContext context) {
    addEventListener(this, Event.PROPERTY_ADDED| Event.PROPERTY_CHANGED, "/content/mysite", null);
    }
}

protected void deactivate(ComponentContext componentContext) {
    removeEventListener(this);
}
person Thomas    schedule 18.12.2014