后端与接口
AEM as a Cloud Service…
在 AEM as a Cloud Service 上需要代码化发布内容到 Publish/Preview、检查发布状态,并监听分发事件处理失败或完成后动作时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
AEM as a Cloud Servi特定
解决思路
- 按任务选择子技能:发布/取消发布内容使用 Replication API(replication/SKILL.md);监控分发生命周期使用 Sling Distribution Events(sling-distribution/SKILL.md)。
- 使用官方 Replication API:使用 com.day.cq.replication 包,主要类为 Replicator、ReplicationOptions、ReplicationStatus、ReplicationActionType。
- 使用官方 Sling Distribution 监控 API:使用 org.apache.sling.distribution 包,重点使用 org.apache.sling.distribution.event 中的事件主题和属性。
- 在 OSGi 服务中通过 @Reference 注入 Replicator。
- 发布单个页面:调用 replicator.replicate(session, ReplicationActionType.ACTIVATE, "/content/mysite/page")。
- 取消发布:调用 replicator.replicate(session, ReplicationActionType.DEACTIVATE, "/content/mysite/page")。
- 批量发布:调用 replicator.replicate(session, ReplicationActionType.ACTIVATE, new String[]{"/content/page1", "/content/page2"}, null),建议路径数 ≤100 以获得事务性保证;超过 100 时系统自动拆分。
- 发布到 Preview:创建 ReplicationOptions,调用 options.setFilter(agent -> "preview".equals(agent.getId())),再传给 replicator.replicate(session, ACTIVATE, path, options)。
- 发布到 Publish:创建 ReplicationOptions,调用 options.setFilter(agent -> "publish".equals(agent.getId())),再传给 replicator.replicate(session, ACTIVATE, path, options)。
- Preview-first 工作流:工作流第一步用 preview agent 发布到 Preview;审批后第二步用 publish agent 发布到 Publish 层。
- 检查发布状态:调用 ReplicationStatus status = replicator.getReplicationStatus(session, path),用 status != null && status.isActivated() 判断是否已发布。
- 注册发布完成监控:实现 EventHandler,并用 @Component(service = EventHandler.class, property = { org.osgi.service.event.EventConstants.EVENT_TOPIC + "=" + DistributionEventTopics.IMPORTER_PACKAGE_IMPORTED }) 监听导入完成事件。
- 在发布完成事件处理中读取 DistributionEventProperties.DISTRIBUTION_PATHS,记录“内容已上线”,并触发缓存预热、通知等 post-publish 动作。
- 注册自动发布处理器:实现 EventHandler,监听 SlingConstants.TOPIC_RESOURCE_CHANGED。
- 在自动发布处理器中读取 SlingConstants.PROPERTY_PATH,调用 shouldAutoPublish(path) 判断,再获取 service resolver 并 adaptTo(Session.class),最后调用 replicator.replicate(session, ACTIVATE, path)。
- 自动发布时用 try/catch 捕获异常并记录日志,避免发布失败导致流程中断。
- 注册失败告警处理器:实现 EventHandler,监听 DistributionEventTopics.AGENT_PACKAGE_DROPPED。
- 在失败告警处理器中读取 DistributionEventProperties.DISTRIBUTION_PACKAGE_ID,调用 alertService.sendAlert("Distribution failed", packageId)。
- 监听完整分发事件生命周期:可注册 EventHandler 监听 DistributionEventTopics.AGENT_PACKAGE_CREATED、AGENT_PACKAGE_QUEUED、AGENT_PACKAGE_DISTRIBUTED、AGENT_PACKAGE_DROPPED、IMPORTER_PACKAGE_IMPORTED。
- 在事件处理中读取 event.getTopic()、DistributionEventProperties.DISTRIBUTION_PACKAGE_ID 和 DISTRIBUTION_PATHS;若 topic 为 AGENT_PACKAGE_DROPPED 记录分发失败,若为 IMPORTER_PACKAGE_IMPORTED 记录内容已上线。
- 遵守路径数限制:每次 API 调用建议 ≤100 个 path;超过时系统自动拆分;setUseAtomicCalls() 已 @Deprecated / “no longer required”。
- 遵守载荷大小限制:payload 最大 10 MB,不含二进制文件。
- 对大型层级内容树,使用 Tree Activation workflow step,而不是自定义代码。
- 用正确的 API:发布用 Replication API,监控用 Distribution events。
- 处理失败:总是捕获 ReplicationException,并监控 AGENT_PACKAGE_DROPPED 事件。
- 使用 service users,不要使用 admin 凭据。
- 只监听需要的事件,避免无谓事件处理。
- 发布前校验权限:调用 replicator.checkPermission()。
- 只发布需要的内容,避免不必要的批量操作。
- 排查 ReplicationException:检查 service user 是否具有 crx:replicate 权限。
- 排查内容未到目标层:检查 agent filter,并检查 replication status。
- 排查 “Too many paths” 错误:使用 ≤100 paths 获得事务性保证,或传入全部 paths,系统会自动拆分。
- 排查事件处理器不触发:确认事件 topic constant 完全匹配。
- 排查缺少事件属性:始终对 event properties 做 null-check。
- 排查处理器拖慢分发:使用异步 job processing,不要阻塞。
- 若需审计或跟踪分发生命周期,按以下流程顺序监控事件:Replicator.replicate() 后 Sling Distribution 打包并触发 AGENT_PACKAGE_CREATED,排队触发 AGENT_PACKAGE_QUEUED,发送到 Adobe Developer Pipeline Service 触发 AGENT_PACKAGE_DISTRIBUTED,目标层导入触发 IMPORTER_PACKAGE_IMPORTED,内容在目标层上线。
- 在 AEM Cloud Service 中不要依赖手动 replication agent 配置;agents 由 Adobe 管理,通过 agent filter 选择 preview 或 publish。
- 从 AEM 6.x 迁移时注意:Replication API 相同,但传输机制改为 Sling Distribution via Adobe pipeline,Preview tier 可用但需要 agent filtering,distribution events 提供完整生命周期,agent configuration 不在 OSGi 暴露。
适用边界 · 注意事项
- 手动发布少量内容或一次性发布时,使用 UI workflows(Quick Publish 或 Manage Publication),而不是编程 API。
- 发布大型层级内容树且不需要自定义逻辑时,使用 Tree Activation workflow,而不是自定义代码。
- 不要尝试在 AEM Cloud Service 中手动配置 replication agents 或 OSGi config;如果流程依赖手动 agent 配置则不适用。