复制 replication
Adobe Experience Manager as a Cloud Service使用Sling内容分发功能将内容移动到要复制到在AEM运行时以外的Adobe Developer上运行的管道服务。
发布内容的方法 methods-of-publishing-content
不建议自行构建批量发布自定义代码。
如果您必须出于任何原因进行自定义,则可以使用现有工作流API通过此步骤触发工作流。
始终最好是仅发布必须发布的内容。 如果不需要的话,谨慎不要尝试发布大量内容。 但是,使用树激活工作流步骤可以通过工作流发送的内容数量没有限制。
快速取消/发布 – 计划取消/发布 publish-unpublish
此功能允许您立即发布选定的页面,而无需通过“管理发布”方法选择其他选项。
有关更多信息,请参阅管理发布。
开启和关闭时间 – 触发器配置 on-and-off-times-trigger-configuration
开始时间和 关闭时间 的附加可能性可从页面属性的“基本”选项卡获得。
若要实现此功能的自动复制,请在OSGi配置 开启关闭触发器配置中启用自动复制:
管理发布 manage-publication
与快速发布相比,管理发布提供了更多选项,允许包含子页面、自定义引用和启动任何适用的工作流,并且还提供了以后发布的选项。
为“稍后发布”选项包含文件夹的子项会调用“发布内容树”工作流,如树复制工作流中所述。
您可以在出版基础文档中找到有关管理出版的更多详细信息。
要批量复制深层内容层级,请使用基于工作流的方法。 有关建议的树激活工作流步骤、配置参数和监视指导,请参阅树复制工作流。 此处还记录了已弃用的发布内容树工作流以供参考。
复制 API replication-api
您可以使用 AEM as a Cloud Service 中提供的复制 API 发布内容。
有关详细信息,请参阅 API 文档。
API 的基本用法
@Reference
Replicator replicator;
@Reference
ReplicationStatusProvider replicationStatusProvider;
....
Session session = ...
// Activate a single page to all agents, which are active by default
replicator.replicate(session,ReplicationActionType.ACTIVATE,"/content/we-retail/en");
// Activate multiple pages (but try to limit it to approx 100 at max)
replicator.replicate(session,ReplicationActionType.ACTIVATE, new String[]{"/content/we-retail/en","/content/we-retail/de"});
// ways to get the replication status
Resource enResource = resourceResolver.getResource("/content/we-retail/en");
Resource deResource = resourceResolver.getResource("/content/we-retail/de");
ReplicationStatus enStatus = enResource.adaptTo(ReplicationStatus.class);
// if you need to get the status for more than 1 resource at once, this approach is more performant
Map<String,ReplicationStatus> allStatus = replicationStatusProvider.getBatchReplicationStatus(enResource,deResource);
复制代理
AEM as a Cloud Service提供了两个预定义的复制代理,这些代理通过Sling Content Distribution将内容从创作层路由到目标层:
- 发布 — 将激活的内容复制到实时发布层。 此代理默认启用,并在从UI、工作流或复制API发布时使用,除非另有指定。
- 预览 — 将内容复制到预览层,以便作者在更改生效之前对其进行审阅。 默认情况下,此代理未启用。
您可以从工具 > 部署 > 分发查看和监视这两个代理:
选择代理信息卡会打开其状态、日志和队列详细信息。
使用特定代理进行复制
使用如上所示的API复制时,仅使用默认启用的代理 — 在AEM as a Cloud Service中,即发布。 要专门复制到预览层,请传递选择预览代理的AgentFilter:
请参阅以下示例:
private static final String PREVIEW_AGENT = "preview";
ReplicationStatus beforeStatus = enResource.adaptTo(ReplicationStatus.class); // beforeStatus.isActivated == false
ReplicationOptions options = new ReplicationOptions();
options.setFilter(new AgentFilter() {
@Override
public boolean isIncluded (Agent agent) {
return agent.getId().equals(PREVIEW_AGENT);
}
});
// will replicate only to preview
replicator.replicate(session,ReplicationActionType.ACTIVATE,"/content/we-retail/en", options);
ReplicationStatus afterStatus = enResource.adaptTo(ReplicationStatus.class); // afterStatus.isActivated == false
ReplicationStatus previewStatus = afterStatus.getStatusForAgent(PREVIEW_AGENT); // previewStatus.isActivated == true
如果复制时没有AgentFilter,则仅使用发布,并且预览层不受影响。
仅当复制包括至少一个默认启用的代理时,资源的整体ReplicationStatus才会更新。 在上述示例中,仅使用了预览,因此ReplicationStatus.isActivated仍为false。 使用getStatusForAgent()检查特定代理的状态 — 例如,仅预览复制后的getStatusForAgent("preview"),或实时发布层的getStatusForAgent("publish")。
使内容失效的方法 invalidating-content
您可以直接使内容失效,方法是使用作者的Sling内容失效(SCD)(首选方法),或使用复制API调用发布Dispatcher Flush复制代理。 有关更多详细信息,请参阅缓存页面。
复制API容量限制
一次复制不到100个路径,以500为限制。 超出限制,将引发ReplicationException。
如果您的应用程序逻辑不需要原子复制,则可以通过将ReplicationOptions.setUseAtomicCalls设置为false来克服此限制,它接受任意数量的路径,但在内部创建存储段以保持在此限制以下。
每次复制调用传输的内容大小不得超过 10 MB。 此规则包括节点和属性,但不包括任何二进制文件(工作流包和内容包被视为二进制文件)。
复制队列 replication-queues
每个复制代理显示两个复制队列。 AEM as a Cloud Service不再为每个发布面板显示单独的队列 — 发布层会自动扩展,因此每个面板队列增加了复杂性,却没有实际好处。 队列状态合并如下:
- 已保留 — 更改永久存储在发布层上。 项目清除此队列后,内容会持续存在;发布实例会随着时间的推移而达到一致状态。
- 已完全发布 — 更改在所有发布pod上处于活动状态,并且受影响路径的Dispatcher缓存已被清除。 在项目清除此队列后,访客会收到更新的内容。
监视复制队列 monitor-replication-queues
-
从AEM 全局导航,导航到工具 > 部署。
-
选择分发,然后打开 发布 或 预览 代理信息卡。
-
在 状态 选项卡上,验证每个队列是否显示正常状态。 查看 个待处理项目 以等待处理工作,查看最近处理过的项目。
-
选择 测试连接 以验证代理是否可以访问分发服务。
-
选择 日志 选项卡以查看内容发布的历史记录。
疑难解答 troubleshooting
如果内容无法发布,将从AEM发布服务中还原发布。 使用监视复制队列打开代理 状态 选项卡并识别受影响的队列。
当队列显示红色状态时,查看其挂起项目以查找导致失败的原因。 选择要查看待定项目的队列,然后根据需要清除单个项目或整个队列。