@@ -9,8 +9,8 @@ Migrates legacy replication code to Cloud Service compatible pattern: **Sling Di
99- CQ Replication API: ` com.day.cq.replication.Replicator ` , ` ReplicationAction ` — ` replicator.replicate(resolver, new ReplicationAction(ReplicationActionType.ACTIVATE, path)) `
1010
1111** Target pattern:**
12- - Sling Distribution API: ` DistributionAgent ` , ` DistributionRequest ` , ` SimpleDistributionRequest `
13- - ` distributionAgent.execute( new SimpleDistributionRequest(DistributionRequestType.ADD, path)) `
12+ - Sling Distribution API: ` Distributor ` , ` DistributionRequest ` , ` SimpleDistributionRequest `
13+ - ` DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, false, path); `
1414- Uses ` getServiceResourceResolver() ` with SUBSERVICE; resolver lifecycle and logging per [ aem-cloud-service-pattern-prerequisites.md] ( aem-cloud-service-pattern-prerequisites.md )
1515
1616## Classification
@@ -19,21 +19,21 @@ Identify which source pattern the file uses:
1919- ** Sling Replication Agent:** Has ` ReplicationAgent ` , ` ReplicationAgentException ` , ` ReplicationResult ` , ` agent.replicate(resolver, ReplicationActionType.*, path) `
2020- ** CQ Replicator:** Has ` com.day.cq.replication.Replicator ` , ` ReplicationAction ` , ` replicator.replicate(resolver, action) `
2121
22- If the file already uses ` DistributionAgent ` and ` DistributionRequest ` / ` SimpleDistributionRequest ` , it may not need migration — verify and skip if already compliant.
22+ If the file already uses ` Distributor ` and ` SimpleDistributionRequest ` , it may not need migration — verify and skip if already compliant.
2323
2424## Pattern-Specific Rules
2525
26- - ** DO** replace ReplicationAgent/Replicator with DistributionAgent
27- - ** DO** replace ReplicationAction/ReplicationResult with DistributionRequest/ SimpleDistributionRequest
26+ - ** DO** replace ReplicationAgent/Replicator with ` Distributor `
27+ - ** DO** replace ReplicationAction/ReplicationResult with ` SimpleDistributionRequest ` / ` DistributionResponse `
2828- ** DO** map ReplicationActionType to DistributionRequestType (e.g., ACTIVATE → ADD)
29- - ** DO** use ` @Reference(target = "(name=agent-name)") ` to target the specific Distribution Agent
29+ - ** DO** use ` publish ` or ` preview ` to target the specific Distribution Agent or both separately if distributing to both publish and preview tiers
3030- ** DO NOT** use administrative resolver or console logging — follow [ aem-cloud-service-pattern-prerequisites.md] ( aem-cloud-service-pattern-prerequisites.md )
3131
3232---
3333
3434## Complete Example: Before and After
3535
36- ### Example 1: CQ Replicator → Sling Distribution Agent
36+ ### Example 1: CQ Replicator → Sling Content Distribution
3737
3838#### Before (Legacy CQ Replicator)
3939
@@ -98,11 +98,11 @@ package com.example.replication;
9898import org.apache.sling.api.resource.LoginException ;
9999import org.apache.sling.api.resource.ResourceResolver ;
100100import org.apache.sling.api.resource.ResourceResolverFactory ;
101- import org.apache.sling.distribution.agent.api.DistributionAgent ;
102- import org.apache.sling.distribution.agent.api.DistributionAgentException ;
103- import org.apache.sling.distribution.agent.api.DistributionRequest ;
104- import org.apache.sling.distribution.agent.api.SimpleDistributionRequest ;
105- import org.apache.sling.distribution.agent.api.DistributionRequestType ;
101+ import org.apache.sling.distribution.Distributor ;
102+ import org.apache.sling.distribution.DistributionRequest ;
103+ import org.apache.sling.distribution.DistributionResponse ;
104+ import org.apache.sling.distribution.DistributionRequestType ;
105+ import org.apache.sling.distribution.SimpleDistributionRequest ;
106106import org.osgi.service.component.annotations.Component ;
107107import org.osgi.service.component.annotations.Reference ;
108108import org.slf4j.Logger ;
@@ -115,8 +115,8 @@ public class PropertyNodeReplicationService {
115115
116116 private static final Logger LOG = LoggerFactory . getLogger(PropertyNodeReplicationService . class);
117117
118- @Reference ( target = " (name=myPropertyDistributionAgent) " )
119- private DistributionAgent distributionAgent ;
118+ @Reference
119+ private Distributor distributor ;
120120
121121 @Reference
122122 private ResourceResolverFactory resolverFactory;
@@ -130,25 +130,25 @@ public class PropertyNodeReplicationService {
130130 return ;
131131 }
132132
133- DistributionRequest request = new SimpleDistributionRequest (
134- DistributionRequestType . ADD ,
133+ DistributionRequest distributionRequest = new SimpleDistributionRequest (
134+ DistributionRequestType . ADD ,
135+ false ,
135136 propertyNodePath
136137 );
137- distributionAgent. execute(request);
138+ DistributionResponse distributionResponse = distributor. distribute(" publish" , resolver, distributionRequest);
139+
138140 LOG . info(" Property Node Distribution successful for path: {}" , propertyNodePath);
139141
140142 } catch (LoginException e) {
141143 LOG . error(" Failed to get resource resolver" , e);
142- } catch (DistributionAgentException e) {
143- LOG . error(" Distribution failed for path: {}" , propertyNodePath, e);
144144 } catch (Exception e) {
145145 LOG . error(" Error during distribution" , e);
146146 }
147147 }
148148}
149149```
150150
151- ### Example 2: Sling Replication Agent → Sling Distribution Agent
151+ ### Example 2: Sling Replication Agent → Sling Content Distribution
152152
153153#### Before (Legacy Sling Replication Agent)
154154
@@ -207,11 +207,11 @@ package com.example.replication;
207207import org.apache.sling.api.resource.LoginException ;
208208import org.apache.sling.api.resource.ResourceResolver ;
209209import org.apache.sling.api.resource.ResourceResolverFactory ;
210- import org.apache.sling.distribution.agent.api.DistributionAgent ;
211- import org.apache.sling.distribution.agent.api.DistributionAgentException ;
212- import org.apache.sling.distribution.agent.api.DistributionRequest ;
213- import org.apache.sling.distribution.agent.api.SimpleDistributionRequest ;
214- import org.apache.sling.distribution.agent.api.DistributionRequestType ;
210+ import org.apache.sling.distribution.Distributor ;
211+ import org.apache.sling.distribution.DistributionRequest ;
212+ import org.apache.sling.distribution.DistributionResponse ;
213+ import org.apache.sling.distribution.DistributionRequestType ;
214+ import org.apache.sling.distribution.SimpleDistributionRequest ;
215215import org.osgi.service.component.annotations.Component ;
216216import org.osgi.service.component.annotations.Reference ;
217217import org.slf4j.Logger ;
@@ -224,8 +224,8 @@ public class ContentReplicationService {
224224
225225 private static final Logger LOG = LoggerFactory . getLogger(ContentReplicationService . class);
226226
227- @Reference ( target = " (name=my-distribution-agent) " )
228- private DistributionAgent distributionAgent ;
227+ @Reference
228+ private Distributor distributor ;
229229
230230 @Reference
231231 private ResourceResolverFactory resolverFactory;
@@ -239,17 +239,16 @@ public class ContentReplicationService {
239239 return ;
240240 }
241241
242- DistributionRequest request = new SimpleDistributionRequest (
243- DistributionRequestType . ADD ,
242+ DistributionRequest distributionRequest = new SimpleDistributionRequest (
243+ DistributionRequestType . ADD ,
244+ false ,
244245 contentPath
245246 );
246- distributionAgent . execute(request );
247+ DistributionResponse distributionResponse = distributor . distribute( " publish " , resolver, distributionRequest );
247248 LOG . info(" Forward Distribution successful for path: {}" , contentPath);
248249
249250 } catch (LoginException e) {
250251 LOG . error(" Failed to get resource resolver" , e);
251- } catch (DistributionAgentException e) {
252- LOG . error(" Distribution failed for path: {}" , contentPath, e);
253252 } catch (Exception e) {
254253 LOG . error(" Error during distribution" , e);
255254 }
@@ -258,15 +257,14 @@ public class ContentReplicationService {
258257```
259258
260259** Key Changes:**
261- - ✅ Replaced ` Replicator ` /` ReplicationAgent ` → ` DistributionAgent `
262- - ✅ Replaced ` ReplicationAction ` /` ReplicationResult ` → ` DistributionRequest ` /` SimpleDistributionRequest `
260+ - ✅ Replaced ` Replicator ` /` ReplicationAgent ` → ` Distributor `
261+ - ✅ Replaced ` ReplicationAction ` /` ReplicationResult ` → ` DistributionRequest ` /` DistributionResponse `
263262- ✅ Mapped ` ReplicationActionType.ACTIVATE ` → ` DistributionRequestType.ADD `
264- - ✅ Added ` @Reference(target = "(name=agent-name)") ` for agent selection
263+ - ✅ Used correct ` publish ` / ` preview ` agent
265264- ✅ Replaced ` getAdministrativeResourceResolver() ` → ` getServiceResourceResolver() ` with SUBSERVICE
266265- ✅ Removed USER/PASSWORD from authInfo (Cloud Service uses SUBSERVICE only)
267266- ✅ Replaced ` System.out/err ` → SLF4J Logger
268267- ✅ Used try-with-resources for ResourceResolver
269- - ✅ ` DistributionAgent.execute() ` no longer requires ResourceResolver parameter (agent uses its own service user)
270268
271269---
272270
@@ -276,7 +274,7 @@ public class ContentReplicationService {
276274
277275Read [ aem-cloud-service-pattern-prerequisites.md] ( aem-cloud-service-pattern-prerequisites.md ) and apply SCR→DS and ResourceResolver/logging ** before** replication-specific steps below.
278276
279- ## P1: Replace ReplicationAgent/Replicator with DistributionAgent
277+ ## P1: Replace ReplicationAgent/Replicator with Distributor
280278
281279** For Sling Replication Agent (ReplicationAgent):**
282280
@@ -292,12 +290,14 @@ if (result.isSuccessful()) {
292290 System . out. println(" Property Node Replication failed for path: " + propertyNodePath);
293291}
294292
295- // AFTER (Sling Distribution Agent)
296- @Reference (target = " (name=myPropertyDistributionAgent)" )
297- private DistributionAgent distributionAgent;
293+ // AFTER (Sling Content Distributor)
294+ @Reference
295+ private Distributor distributor;
296+
297+ DistributionRequest distributionRequest = new SimpleDistributionRequest (DistributionRequestType . ADD , false , propertyNodePath);
298+
299+ DistributionResponse distributionResponse = distributor. distribute(" publish" , resolver, distributionRequest);
298300
299- DistributionRequest request = new SimpleDistributionRequest (DistributionRequestType . ADD , propertyNodePath);
300- distributionAgent. execute(request);
301301LOG . info(" Property Node Distribution successful for path: {}" , propertyNodePath);
302302```
303303
@@ -312,12 +312,13 @@ ReplicationAction action = new ReplicationAction(ReplicationActionType.ACTIVATE,
312312replicator. replicate(resolver, action);
313313System . out. println(" Forward Replication successful for path: " + contentPath);
314314
315- // AFTER (Sling Distribution Agent)
316- @Reference (target = " (name=my-distribution-agent)" )
317- private DistributionAgent distributionAgent;
315+ // AFTER (Sling Content Distributor)
316+ @Reference
317+ private Distributor distributor;
318+
319+ DistributionRequest distributionRequest = new SimpleDistributionRequest (DistributionRequestType . ADD , false , contentPath);
318320
319- DistributionRequest request = new SimpleDistributionRequest (DistributionRequestType . ADD , contentPath);
320- distributionAgent. execute(request);
321+ DistributionResponse distributionResponse = distributor. distribute(" publish" , resolver, distributionRequest);
321322LOG . info(" Forward Distribution successful for path: {}" , contentPath);
322323```
323324
@@ -330,7 +331,7 @@ LOG.info("Forward Distribution successful for path: {}", contentPath);
330331| ` ADD ` | ` ADD ` |
331332| ` DELETE ` | ` DELETE ` |
332333
333- ** Note:** ` DistributionAgent.execute(request )` does not require a ResourceResolver parameter — the agent uses its own service user. If the resolver is needed for other logic , retain it per [ resource-resolver-logging.md] ( resource-resolver-logging.md ) (try-with-resources, service user).
334+ ** Note:** ` Distributor.distribute(agent-name, resolver, distributionRequest )` requires a ResourceResolver parameter, retain it per [ resource-resolver-logging.md] ( resource-resolver-logging.md ) (try-with-resources, service user).
334335
335336## P2: Update imports
336337
@@ -359,11 +360,11 @@ import org.apache.felix.scr.annotations.*; // must be gone when done
359360import org.apache.sling.api.resource.LoginException ;
360361import org.apache.sling.api.resource.ResourceResolver ;
361362import org.apache.sling.api.resource.ResourceResolverFactory ;
362- import org.apache.sling.distribution.agent.api.DistributionAgent ;
363- import org.apache.sling.distribution.agent.api.DistributionAgentException ;
364- import org.apache.sling.distribution.agent.api.DistributionRequest ;
365- import org.apache.sling.distribution.agent.api.SimpleDistributionRequest ;
366- import org.apache.sling.distribution.agent.api.DistributionRequestType ;
363+ import org.apache.sling.distribution.Distributor ;
364+ import org.apache.sling.distribution.DistributionRequest ;
365+ import org.apache.sling.distribution.DistributionResponse ;
366+ import org.apache.sling.distribution.DistributionRequestType ;
367+ import org.apache.sling.distribution.SimpleDistributionRequest ;
367368import org.osgi.framework.Constants ;
368369import org.osgi.service.component.annotations.Component ;
369370import org.osgi.service.component.annotations.Reference ;
@@ -380,8 +381,9 @@ import java.util.Map;
380381## Replication/Distribution Checklist
381382
382383- [ ] No ` ReplicationAgent ` , ` Replicator ` , ` ReplicationAction ` , or ` ReplicationResult ` remains
383- - [ ] Uses ` DistributionAgent ` with ` @Reference(target = "(name=agent-name)") `
384- - [ ] Uses ` DistributionRequest ` / ` SimpleDistributionRequest ` with ` DistributionRequestType `
384+ - [ ] Uses ` Distributor ` (` org.apache.sling.distribution ` )
385+ - [ ] Uses ` SimpleDistributionRequest ` with ` DistributionRequestType ` from ` org.apache.sling.distribution `
386+ - [ ] Calls ` distributor.distribute("publish", resolver, distributionRequest) ` with the service-user resolver
385387- [ ] [ aem-cloud-service-pattern-prerequisites.md] ( aem-cloud-service-pattern-prerequisites.md ) satisfied (SCR→DS, resolver/logging, auth maps)
386388- [ ] ` scheduler.concurrent=false ` is set (if using scheduler)
387389- [ ] Code compiles: ` mvn clean compile `
0 commit comments