Adobe CQ:关于事件监听器中的会话

时间:2014-12-17 19:39:07

标签: session cq5 aem jcr sling

我对事件监听器有疑问。我们有一个事件监听器,它监听删除节点事件并执行一些活动,例如“发送电子邮件”。

虽然代码审查我发现了这一点,虽然这段代码工作正常但我不相信这里处理的会话:

@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());
        }
    }
}

问题:

  • 最佳做法是创建对此类私有的会话对象,并且应该在停用方法中注销?
  • 在观察管理器中添加事件后,我们真的需要会话对象吗?我期待着是否应该从那里的会话退出。

1 个答案:

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