Skip to content

Commit 76d1666

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

File tree

9 files changed

+114
-18
lines changed

9 files changed

+114
-18
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: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,23 @@ 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+
}
153152

154-
this.logger.info("Registered Activity: {}", clazz.getSimpleName());
153+
/**
154+
* Registers an Activity object.
155+
*
156+
* @param <T> any WorkflowActivity type
157+
* @param name Name of the activity to register.
158+
* @param clazz Class of the activity to register.
159+
* @return the WorkflowRuntimeBuilder
160+
*/
161+
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(String name, Class<T> clazz) {
162+
this.builder.addActivity(new WorkflowActivityClassWrapper<>(name, clazz));
163+
this.activitySet.add(name);
164+
this.activities.add(name);
165+
166+
this.logger.info("Registered Activity: {}", name);
155167

156168
return this;
157169
}
@@ -164,13 +176,23 @@ public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(Clas
164176
* @return the WorkflowRuntimeBuilder
165177
*/
166178
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(T instance) {
167-
Class<T> clazz = (Class<T>) instance.getClass();
179+
return this.registerActivity(instance.getClass().getCanonicalName(), instance);
180+
}
168181

169-
this.builder.addActivity(new WorkflowActivityInstanceWrapper<>(instance));
170-
this.activitySet.add(clazz.getCanonicalName());
171-
this.activities.add(clazz.getSimpleName());
182+
/**
183+
* Registers an Activity object.
184+
*
185+
* @param <T> any WorkflowActivity type
186+
* @param name Name of the activity to register.
187+
* @param instance the class instance being registered
188+
* @return the WorkflowRuntimeBuilder
189+
*/
190+
public <T extends WorkflowActivity> WorkflowRuntimeBuilder registerActivity(String name, T instance) {
191+
this.builder.addActivity(new WorkflowActivityInstanceWrapper<>(name, instance));
192+
this.activitySet.add(name);
193+
this.activities.add(name);
172194

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

175197
return this;
176198
}

sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowActivityClassWrapperTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Object run(WorkflowActivityContext ctx) {
2222

2323
@Test
2424
public void getName() {
25-
WorkflowActivityClassWrapper<TestActivity> wrapper = new WorkflowActivityClassWrapper<>(TestActivity.class);
25+
WorkflowActivityClassWrapper<TestActivity> wrapper = new WorkflowActivityClassWrapper<>("io.dapr.workflows.runtime.WorkflowActivityClassWrapperTest.TestActivity", TestActivity.class);
2626

2727
assertEquals(
2828
"io.dapr.workflows.runtime.WorkflowActivityClassWrapperTest.TestActivity",
@@ -33,7 +33,7 @@ public void getName() {
3333
@Test
3434
public void createWithClass() {
3535
TaskActivityContext mockContext = mock(TaskActivityContext.class);
36-
WorkflowActivityClassWrapper<TestActivity> wrapper = new WorkflowActivityClassWrapper<>(TestActivity.class);
36+
WorkflowActivityClassWrapper<TestActivity> wrapper = new WorkflowActivityClassWrapper<>("a",TestActivity.class);
3737

3838
when(mockContext.getInput(String.class)).thenReturn("Hello");
3939
when(mockContext.getName()).thenReturn("TestActivityContext");

sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowActivityInstanceWrapperTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Object run(WorkflowActivityContext ctx) {
2222

2323
@Test
2424
public void getName() {
25-
WorkflowActivityInstanceWrapper<TestActivity> wrapper = new WorkflowActivityInstanceWrapper<>(new TestActivity());
25+
WorkflowActivityInstanceWrapper<TestActivity> wrapper = new WorkflowActivityInstanceWrapper<>("io.dapr.workflows.runtime.WorkflowActivityInstanceWrapperTest.TestActivity", new TestActivity());
2626

2727
assertEquals(
2828
"io.dapr.workflows.runtime.WorkflowActivityInstanceWrapperTest.TestActivity",
@@ -33,7 +33,7 @@ public void getName() {
3333
@Test
3434
public void createWithInstance() {
3535
TaskActivityContext mockContext = mock(TaskActivityContext.class);
36-
WorkflowActivityInstanceWrapper<TestActivity> wrapper = new WorkflowActivityInstanceWrapper<>(new TestActivity());
36+
WorkflowActivityInstanceWrapper<TestActivity> wrapper = new WorkflowActivityInstanceWrapper<>("a", new TestActivity());
3737

3838
when(mockContext.getInput(String.class)).thenReturn("Hello");
3939
when(mockContext.getName()).thenReturn("TestActivityContext");

sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,6 @@ public void loggingOutputTest() {
9494
.info(eq("Registered Workflow: {}"), eq("TestWorkflow"));
9595

9696
verify(testLogger, times(1))
97-
.info(eq("Registered Activity: {}"), eq("TestActivity"));
97+
.info(eq("Registered Activity: {}"), eq( "io.dapr.workflows.runtime.WorkflowRuntimeBuilderTest.TestActivity"));
9898
}
9999
}

0 commit comments

Comments
 (0)