Aem CQ 5.6反向复制:已触发复制,但未找到或选择代理

Aem CQ 5.6反向复制:已触发复制,但未找到或选择代理,aem,Aem,我正在尝试为CQ5.6编写自定义文件上载组件,但我遇到了反向复制的问题。在发布实例中创建的节点,但未复制到作者实例。调用replicator后,下一行出现在error.log中: com.day.cq.replication.impl.ReplicatorImpl Replication triggered, but no agent found or selected. 复制代理已打开。在其他情况下,例如userforms,复制工作成功,因此我认为问题出在我的代码中的某个地方。我使用的代码如

我正在尝试为CQ5.6编写自定义文件上载组件,但我遇到了反向复制的问题。在发布实例中创建的节点,但未复制到作者实例。调用replicator后,下一行出现在error.log中:

com.day.cq.replication.impl.ReplicatorImpl Replication triggered, but no agent found or selected.
复制代理已打开。在其他情况下,例如userforms,复制工作成功,因此我认为问题出在我的代码中的某个地方。我使用的代码如下:

Node node = session.getNode(path);
ValueFactory valueFactory = session.getValueFactory();
Binary contentValue = valueFactory.createBinary(is);
Node parent = node.addNode(fileName, "nt:unstructured");
parent.setProperty(DELETED, false);
parent.setProperty(DESCRIPTION, description);
Node fileNode = parent.addNode(fileName, "nt:file");
fileNode.addMixin("mix:referenceable");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty(Property.JCR_DATA, contentValue);
Calendar lastModified = Calendar.getInstance();
lastModified.setTimeInMillis(lastModified.getTimeInMillis());
resNode.setProperty(Property.JCR_LAST_MODIFIED, lastModified);
parent.setProperty("cq:distribute", true);
parent.setProperty("cq:lastModified", Calendar.getInstance());
parent.setProperty("cq:lastModifiedBy", session.getUserID());
session.save();
replicator.replicate(session, ReplicationActionType.ACTIVATE, parent.getPath());
session.logout();
我应该怎么做才能使反向复制适用于我在servlet中创建的这个节点

更新: 根据Tomek Rękawek的回答,我更新了代码,但问题仍然没有解决。以下是新代码:

ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
Session session = resourceResolver.adaptTo(Session.class);
String path = (String) componentContext.getProperties().get(SAVEPATH);
Node node = session.getNode(path);
ValueFactory valueFactory = session.getValueFactory();
Binary contentValue = valueFactory.createBinary(is);
Node parent = node.addNode(fileName, "cq:Page");
Node jcrContent = parent.addNode("jcr:content", "cq:PageContent");
jcrContent.setProperty("cq:distribute", true);
jcrContent.setProperty("cq:lastModified", Calendar.getInstance());
jcrContent.setProperty("cq:lastModifiedBy", session.getUserID());
Node fileNode = jcrContent.addNode(fileName, "nt:file");
fileNode.addMixin("mix:referenceable");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty(Property.JCR_DATA, contentValue);
session.save();
session.logout();

反向复制是由作者实例执行的操作,而不是发布。负责此操作的代理是作者上的反向复制代理。它每30秒连接一次发布,并使用cq:distribute属性集收集页面节点

要反向复制映像,您需要:

创建cq:Page节点 在其下创建cq:PageContent节点,并将其命名为jcr:content。 在jcr:content下创建图像节点并保存会话[已编辑] 在jcr:content节点上设置cq:distribute、cq:lastModified和cq:lastModifiedBy属性。 保存会话 创建换页输入流并反向复制它的示例方法:

private void reverseReplicateBinary(Session session, String parentPath, String name, InputStream is)
        throws RepositoryException {
    ValueFactory valueFactory = session.getValueFactory();
    Node parent = session.getNode(parentPath);

    Node page = JcrUtils.getOrCreateUniqueByPath(parent, name, "cq:Page");
    Node jcrContent = page.addNode(Property.JCR_CONTENT, "cq:PageContent");
    Node file = jcrContent.addNode("file", "nt:file");
    Node resource = file.addNode(Property.JCR_CONTENT, "nt:resource");
    resource.setProperty(Property.JCR_DATA, valueFactory.createBinary(is));
    session.save();

    jcrContent.setProperty("cq:lastModified", Calendar.getInstance());
    jcrContent.setProperty("cq:lastModifiedBy", session.getUserID());
    jcrContent.setProperty("cq:distribute", false);
    session.save();
}
完整的示例可以在上找到


就这些。您不需要手动调用replicator,author实例将自动收集页面。

反向复制是由author实例执行的操作,而不是发布。负责此操作的代理是作者上的反向复制代理。它每30秒连接一次发布,并使用cq:distribute属性集收集页面节点

要反向复制映像,您需要:

创建cq:Page节点 在其下创建cq:PageContent节点,并将其命名为jcr:content。 在jcr:content下创建图像节点并保存会话[已编辑] 在jcr:content节点上设置cq:distribute、cq:lastModified和cq:lastModifiedBy属性。 保存会话 创建换页输入流并反向复制它的示例方法:

private void reverseReplicateBinary(Session session, String parentPath, String name, InputStream is)
        throws RepositoryException {
    ValueFactory valueFactory = session.getValueFactory();
    Node parent = session.getNode(parentPath);

    Node page = JcrUtils.getOrCreateUniqueByPath(parent, name, "cq:Page");
    Node jcrContent = page.addNode(Property.JCR_CONTENT, "cq:PageContent");
    Node file = jcrContent.addNode("file", "nt:file");
    Node resource = file.addNode(Property.JCR_CONTENT, "nt:resource");
    resource.setProperty(Property.JCR_DATA, valueFactory.createBinary(is));
    session.save();

    jcrContent.setProperty("cq:lastModified", Calendar.getInstance());
    jcrContent.setProperty("cq:lastModifiedBy", session.getUserID());
    jcrContent.setProperty("cq:distribute", false);
    session.save();
}
完整的示例可以在上找到


就这些。您不需要手动调用replicator,author实例将自动收集页面。

对于您的replicator对象,请确保设置发件箱的代理ID

    AgentIdFilter filter = new AgentIdFilter("outbox");
    ReplicationOptions opts = new ReplicationOptions();
    opts.setFilter(filter);
    replicator.replicate(session, ReplicationActionType.ACTIVATE, parent.getPath(), opts);

对于replicator对象,请确保设置发件箱的代理ID

    AgentIdFilter filter = new AgentIdFilter("outbox");
    ReplicationOptions opts = new ReplicationOptions();
    opts.setFilter(filter);
    replicator.replicate(session, ReplicationActionType.ACTIVATE, parent.getPath(), opts);

你能用新版本的代码更新你的问题吗?保存会话后,发布日志中是否有任何与复制相关的消息?我已更新了问题,很抱歉,我没有及时完成。不,日志中没有任何与复制相关的消息。似乎您必须在创建页面后保存会话,然后添加三个cq:。。。属性并再次保存会话。我已经更新了我的答案。@Tomek Rękawek是否可以编写自定义反向复制器,从与cq无关的外部服务收集数据?@TomekRękawek我遵循了这些步骤,它以前在AEM6.0中工作得很好。但突然将cq:distribute设置为true已停止触发反向复制。我想知道这些步骤是否适用于AEM的特定版本。我使用的是AEM6.1 SP1,你能用新版本的代码更新你的问题吗?保存会话后,发布日志中是否有任何与复制相关的消息?我已更新了问题,很抱歉,我没有及时完成。不,日志中没有任何与复制相关的消息。似乎您必须在创建页面后保存会话,然后添加三个cq:。。。属性并再次保存会话。我已经更新了我的答案。@Tomek Rękawek是否可以编写自定义反向复制器,从与cq无关的外部服务收集数据?@TomekRękawek我遵循了这些步骤,它以前在AEM6.0中工作得很好。但突然将cq:distribute设置为true已停止触发反向复制。我想知道这些步骤是否适用于AEM的特定版本。我正在使用AEM6.1 SP1