我正在尝试为 CQ5.6 编写自定义文件上传组件,但遇到了反向复制的问题。在 Publish 实例中创建的节点,但未复制到 Author 实例。调用复制器后,error.log 中出现下一行:
\n\ncom.day.cq.replication.impl.ReplicatorImpl Replication triggered, but no agent found or selected.\nRun Code Online (Sandbox Code Playgroud)\n\n复制代理已打开。在其他情况下,例如用户表单,复制工作成功,所以我认为问题出在我的代码中的某个地方。有我使用的代码:
\n\nNode 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();\nRun Code Online (Sandbox Code Playgroud)\n\n我应该怎么做才能使反向复制适用于我在 servlet 中创建的节点?
\n\n更新: \n根据 Tomek R\xc4\x99kawek 的回答,我更新了我的代码,但问题仍然没有解决。这是新代码:
\n\nResourceResolver 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();\nRun Code Online (Sandbox Code Playgroud)\n
反向复制是作者实例执行的操作,而不是发布实例执行的操作。负责此操作的代理是作者的反向复制代理。它每 30 秒连接一次发布并收集具有cq:distribute属性集的页面节点。
为了反向复制图像,您需要:
cq:Page节点cq:PageContent节点并命名jcr:content。jcr:content 并保存会话[编辑]cq:distribute、cq:lastModified和cq:lastModifiedBy属性jcr:content。创建页面换行输入流并反向复制它的示例方法:
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,作者实例将自动收集页面。