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

gob*_*lin 2 aem

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

\n\n
com.day.cq.replication.impl.ReplicatorImpl Replication triggered, but no agent found or selected.\n
Run Code Online (Sandbox Code Playgroud)\n\n

复制代理已打开。在其他情况下,例如用户表单,复制工作成功,所以我认为问题出在我的代码中的某个地方。有我使用的代码:

\n\n
Node node = session.getNode(path);\nValueFactory valueFactory = session.getValueFactory();\nBinary contentValue = valueFactory.createBinary(is);\nNode parent = node.addNode(fileName, "nt:unstructured");\nparent.setProperty(DELETED, false);\nparent.setProperty(DESCRIPTION, description);\nNode fileNode = parent.addNode(fileName, "nt:file");\nfileNode.addMixin("mix:referenceable");\nNode resNode = fileNode.addNode("jcr:content", "nt:resource");\nresNode.setProperty(Property.JCR_DATA, contentValue);\nCalendar lastModified = Calendar.getInstance();\nlastModified.setTimeInMillis(lastModified.getTimeInMillis());\nresNode.setProperty(Property.JCR_LAST_MODIFIED, lastModified);\nparent.setProperty("cq:distribute", true);\nparent.setProperty("cq:lastModified", Calendar.getInstance());\nparent.setProperty("cq:lastModifiedBy", session.getUserID());\nsession.save();\nreplicator.replicate(session, ReplicationActionType.ACTIVATE, parent.getPath());\nsession.logout();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我应该怎么做才能使反向复制适用于我在 servlet 中创建的节点?

\n\n

更新: \n根据 Tomek R\xc4\x99kawek 的回答,我更新了我的代码,但问题仍然没有解决。这是新代码:

\n\n
ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);\nSession session = resourceResolver.adaptTo(Session.class);\nString path = (String) componentContext.getProperties().get(SAVEPATH);\nNode node = session.getNode(path);\nValueFactory valueFactory = session.getValueFactory();\nBinary contentValue = valueFactory.createBinary(is);\nNode parent = node.addNode(fileName, "cq:Page");\nNode jcrContent = parent.addNode("jcr:content", "cq:PageContent");\njcrContent.setProperty("cq:distribute", true);\njcrContent.setProperty("cq:lastModified", Calendar.getInstance());\njcrContent.setProperty("cq:lastModifiedBy", session.getUserID());\nNode fileNode = jcrContent.addNode(fileName, "nt:file");\nfileNode.addMixin("mix:referenceable");\nNode resNode = fileNode.addNode("jcr:content", "nt:resource");\nresNode.setProperty(Property.JCR_DATA, contentValue);\nsession.save();\nsession.logout();\n
Run Code Online (Sandbox Code Playgroud)\n

Tom*_*wek 5

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

为了反向复制图像,您需要:

  1. 创建cq:Page节点
  2. 在其下创建cq:PageContent节点并命名jcr:content
  3. 在 下创建图像节点jcr:content 并保存会话[编辑]
  4. 设置节点上的cq:distributecq:lastModifiedcq:lastModifiedBy属性jcr:content
  5. 保存会话

创建页面换行输入流并反向复制它的示例方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

完整的例子可以在要点上找到。

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