Skip to content

Commit

Permalink
Add workflow sample task chaining
Browse files Browse the repository at this point in the history
Signed-off-by: MregXN <mregxn@gmail.com>
  • Loading branch information
MregXN committed Dec 9, 2023
1 parent 10ef818 commit 075c907
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 0 deletions.
7 changes: 7 additions & 0 deletions all.sln
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BulkPublishEventExample", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowUnitTest", "examples\Workflow\WorkflowUnitTest\WorkflowUnitTest.csproj", "{8CA09061-2BEF-4506-A763-07062D2BD6AC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowFanOutFanIn", "examples\Workflow\WorkflowTaskChaining\WorkflowFanOutFanIn.csproj", "{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -248,6 +250,10 @@ Global
{DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|Any CPU.Build.0 = Release|Any CPU
{8CA09061-2BEF-4506-A763-07062D2BD6AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CA09061-2BEF-4506-A763-07062D2BD6AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -293,6 +299,7 @@ Global
{4A175C27-EAFE-47E7-90F6-873B37863656} = {0EF6EA64-D7C3-420D-9890-EAE8D54A57E6}
{DDC41278-FB60-403A-B969-2AEBD7C2D83C} = {0EF6EA64-D7C3-420D-9890-EAE8D54A57E6}
{8CA09061-2BEF-4506-A763-07062D2BD6AC} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9}
{96C8AD2A-D0BF-4E41-B681-A4DFA2A3BFC1} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
Expand Down
13 changes: 13 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/Activities/Step1.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Dapr.Workflow;

namespace WorkflowTaskChianing.Activities
{
public class Step1 : WorkflowActivity<int, int>
{
public override Task<int> RunAsync(WorkflowActivityContext context, int input)
{
Console.WriteLine($"Step 1: Received input: {input}.");
return Task.FromResult<int>(input + 1);
}
}
}
13 changes: 13 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/Activities/Step2.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Dapr.Workflow;

namespace WorkflowTaskChianing.Activities
{
public class Step2 : WorkflowActivity<int, int>
{
public override Task<int> RunAsync(WorkflowActivityContext context, int input)
{
Console.WriteLine($"Step 2: Received input: {input}.");
return Task.FromResult<int>(input * 2);
}
}
}
13 changes: 13 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/Activities/Step3.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Dapr.Workflow;

namespace WorkflowTaskChianing.Activities
{
public class Step3 : WorkflowActivity<int, int>
{
public override Task<int> RunAsync(WorkflowActivityContext context, int input)
{
Console.WriteLine($"Step 3: Received input: {input}.");
return Task.FromResult<int>(input ^ 2);
}
}
}
67 changes: 67 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using Dapr.Client;
using Dapr.Workflow;
using WorkflowTaskChianing.Activities;
using WorkflowTaskChianing.Workflows;
using Microsoft.Extensions.Hosting;

const string DaprWorkflowComponent = "dapr";

// The workflow host is a background service that connects to the sidecar over gRPC
var builder = Host.CreateDefaultBuilder(args).ConfigureServices(services =>
{
services.AddDaprWorkflow(options =>
{
options.RegisterWorkflow<DemoWorkflow>();
options.RegisterActivity<Step1>();
options.RegisterActivity<Step2>();
options.RegisterActivity<Step3>();
});
});

// Dapr uses a random port for gRPC by default. If we don't know what that port
// is (because this app was started separate from dapr), then assume 4001.
if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DAPR_GRPC_PORT")))
{
Environment.SetEnvironmentVariable("DAPR_GRPC_PORT", "4001");
}

// Start the app - this is the point where we connect to the Dapr sidecar to
// listen for workflow work-items to execute.
using var host = builder.Build();
host.Start();


DaprClient daprClient = new DaprClientBuilder().Build();

while (!await daprClient.CheckHealthAsync())
{
Thread.Sleep(TimeSpan.FromSeconds(5));
}

int wfInput = 42;
using (daprClient)
{
Console.WriteLine($"Workflow Started.");
await daprClient.WaitForSidecarAsync();

string instanceId = $"demo-workflow-{Guid.NewGuid().ToString()[..8]}";

await daprClient.StartWorkflowAsync(
workflowComponent: DaprWorkflowComponent,
workflowName: nameof(DemoWorkflow),
instanceId: instanceId,
input: wfInput);


await daprClient.WaitForWorkflowCompletionAsync(
workflowComponent: DaprWorkflowComponent,
instanceId: instanceId);

GetWorkflowResponse state = await daprClient.GetWorkflowAsync(
instanceId: instanceId,
workflowComponent: DaprWorkflowComponent);
Console.WriteLine($"Workflow state: {state.RuntimeStatus}");

string result = string.Join(" ", state.ReadOutputAs<int[]>());
Console.WriteLine($"Workflow result: {result}");
}
14 changes: 14 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/WorkflowFanOutFanIn.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<ProjectReference Include="..\..\..\src\Dapr.Workflow\Dapr.Workflow.csproj" />
</ItemGroup>

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<NoWarn>612,618</NoWarn>
</PropertyGroup>

</Project>
18 changes: 18 additions & 0 deletions examples/Workflow/WorkflowTaskChaining/Workflows/DemoWorkflow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Dapr.Workflow;
using WorkflowTaskChianing.Activities;

namespace WorkflowTaskChianing.Workflows
{
public class DemoWorkflow : Workflow<int, int[]>
{
public override async Task<int[]> RunAsync(WorkflowContext context, int input)
{
int result1 = await context.CallActivityAsync<int>(nameof(Step1), input);
int result2 = await context.CallActivityAsync<int>(nameof(Step2), result1);
int result3 = await context.CallActivityAsync<int>(nameof(Step3), result2);
int[] ret = new int[] { result1, result2, result3 };

return ret;
}
}
}

0 comments on commit 075c907

Please sign in to comment.