Skip to content

Commit 8a48dec

Browse files
committed
feat: Support register of activities with custom name
Signed-off-by: Javier Aliaga <[email protected]>
1 parent d01da7a commit 8a48dec

File tree

6 files changed

+104
-13
lines changed

6 files changed

+104
-13
lines changed

sdk-tests/src/test/java/io/dapr/it/testcontainers/workflows/DaprWorkflowsIT.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,27 @@ public void testSuspendAndResumeWorkflows() throws Exception {
147147

148148
}
149149

150+
@Test
151+
public void testNamedActivitiesWorkflows() throws Exception {
152+
TestWorkflowPayload payload = new TestWorkflowPayload(new ArrayList<>());
153+
String instanceId = workflowClient.scheduleNewWorkflow(TestNamedActivitiesWorkflow.class, payload);
154+
155+
workflowClient.waitForInstanceStart(instanceId, Duration.ofSeconds(10), false);
156+
157+
Duration timeout = Duration.ofSeconds(10);
158+
WorkflowInstanceStatus workflowStatus = workflowClient.waitForInstanceCompletion(instanceId, timeout, true);
159+
160+
assertNotNull(workflowStatus);
161+
162+
TestWorkflowPayload workflowOutput = deserialize(workflowStatus.getSerializedOutput());
163+
164+
assertEquals(3, workflowOutput.getPayloads().size());
165+
assertEquals("First Activity", workflowOutput.getPayloads().get(0));
166+
assertEquals("First Activity", workflowOutput.getPayloads().get(1));
167+
assertEquals("Second Activity", workflowOutput.getPayloads().get(2));
168+
169+
assertEquals(instanceId, workflowOutput.getWorkflowId());
170+
}
150171

151172
private TestWorkflowPayload deserialize(String value) throws JsonProcessingException {
152173
return OBJECT_MAPPER.readValue(value, TestWorkflowPayload.class);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2025 The Dapr Authors
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
limitations under the License.
12+
*/
13+
14+
package io.dapr.it.testcontainers.workflows;
15+
16+
import io.dapr.workflows.Workflow;
17+
import io.dapr.workflows.WorkflowStub;
18+
import org.slf4j.Logger;
19+
20+
public class TestNamedActivitiesWorkflow implements Workflow {
21+
22+
@Override
23+
public WorkflowStub create() {
24+
return ctx -> {
25+
Logger logger = ctx.getLogger();
26+
String instanceId = ctx.getInstanceId();
27+
logger.info("Starting Workflow: " + ctx.getName());
28+
logger.info("Instance ID: " + instanceId);
29+
logger.info("Current Orchestration Time: " + ctx.getCurrentInstant());
30+
31+
TestWorkflowPayload workflowPayload = ctx.getInput(TestWorkflowPayload.class);
32+
workflowPayload.setWorkflowId(instanceId);
33+
34+
var payloadAfterA = ctx.callActivity("a", workflowPayload, TestWorkflowPayload.class).await();
35+
36+
var payloadAfterB = ctx.callActivity("b", payloadAfterA, TestWorkflowPayload.class).await();
37+
38+
var payloadAfteC = ctx.callActivity("c", payloadAfterB, TestWorkflowPayload.class)
39+
.await();
40+
41+
ctx.complete(payloadAfteC);
42+
};
43+
}
44+
45+
}

sdk-tests/src/test/java/io/dapr/it/testcontainers/workflows/TestWorkflowsConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,14 @@ public WorkflowRuntimeBuilder workflowRuntimeBuilder(
5656
WorkflowRuntimeBuilder builder = new WorkflowRuntimeBuilder(new Properties(overrides));
5757

5858
builder.registerWorkflow(TestWorkflow.class);
59+
builder.registerWorkflow(TestNamedActivitiesWorkflow.class);
60+
5961
builder.registerActivity(FirstActivity.class);
6062
builder.registerActivity(SecondActivity.class);
63+
builder.registerActivity("a",FirstActivity.class);
64+
builder.registerActivity("b",FirstActivity.class);
65+
builder.registerActivity("c", new SecondActivity());
66+
6167

6268
return builder;
6369
}

sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowActivityClassWrapper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ public class WorkflowActivityClassWrapper<T extends WorkflowActivity> implements
3030
/**
3131
* Constructor for WorkflowActivityWrapper.
3232
*
33+
* @param name Name of the activity to wrap.
3334
* @param clazz Class of the activity to wrap.
3435
*/
35-
public WorkflowActivityClassWrapper(Class<T> clazz) {
36-
this.name = clazz.getCanonicalName();
36+
public WorkflowActivityClassWrapper(String name, Class<T> clazz) {
37+
this.name = name;
3738
try {
3839
this.activityConstructor = clazz.getDeclaredConstructor();
3940
} catch (NoSuchMethodException e) {

sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowActivityInstanceWrapper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ public class WorkflowActivityInstanceWrapper<T extends WorkflowActivity> impleme
2727
/**
2828
* Constructor for WorkflowActivityWrapper.
2929
*
30+
* @param name Name of the activity to wrap.
3031
* @param instance Instance of the activity to wrap.
3132
*/
32-
public WorkflowActivityInstanceWrapper(T instance) {
33-
this.name = instance.getClass().getCanonicalName();
33+
public WorkflowActivityInstanceWrapper(String name, T instance) {
34+
this.name = name;
3435
this.activity = instance;
3536
}
3637

sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,20 @@ public <T extends Workflow> WorkflowRuntimeBuilder registerWorkflow(T instance)
147147
* @return the WorkflowRuntimeBuilder
148148
*/
149149
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(Class<T> clazz) {
150-
this.builder.addActivity(new WorkflowActivityClassWrapper<>(clazz));
151-
this.activitySet.add(clazz.getCanonicalName());
152-
this.activities.add(clazz.getSimpleName());
150+
return registerActivity(clazz.getCanonicalName(), clazz);
151+
}
152+
153+
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(String name, Class<T> clazz) {
154+
this.builder.addActivity(new WorkflowActivityClassWrapper<>(name, clazz));
155+
this.activitySet.add(name);
156+
this.activities.add(name);
153157

154-
this.logger.info("Registered Activity: {}", clazz.getSimpleName());
158+
this.logger.info("Registered Activity: {}", name);
155159

156160
return this;
157161
}
158162

163+
159164
/**
160165
* Registers an Activity object.
161166
*
@@ -164,15 +169,27 @@ public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(Clas
164169
* @return the WorkflowRuntimeBuilder
165170
*/
166171
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(T instance) {
167-
Class<T> clazz = (Class<T>) instance.getClass();
172+
return this.registerActivity(instance.getClass().getCanonicalName(), instance);
173+
}
168174

169-
this.builder.addActivity(new WorkflowActivityInstanceWrapper<>(instance));
170-
this.activitySet.add(clazz.getCanonicalName());
171-
this.activities.add(clazz.getSimpleName());
175+
/**
176+
* Registers an Activity object.
177+
*
178+
* @param <T> any WorkflowActivity type
179+
* @param instance the class instance being registered
180+
* @return the WorkflowRuntimeBuilder
181+
*/
182+
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(String name, T instance) {
183+
184+
this.builder.addActivity(new WorkflowActivityInstanceWrapper<>(name, instance));
185+
this.activitySet.add(name);
186+
this.activities.add(name);
172187

173-
this.logger.info("Registered Activity: {}", clazz.getSimpleName());
188+
this.logger.info("Registered Activity: {}", name);
174189

175190
return this;
176191
}
177192

193+
194+
178195
}

0 commit comments

Comments
 (0)