diff --git a/all.sln b/all.sln index 1dd0ab3c5..4e12c4f8b 100644 --- a/all.sln +++ b/all.sln @@ -97,6 +97,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}") = "WorkflowSubWorkflow", "examples\Workflow\WorkflowSubWorkflow\WorkflowSubWorkflow.csproj", "{310BD727-837D-47B2-83F2-C57E61B0DC36}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GeneratedActor", "GeneratedActor", "{7592AFA4-426B-42F3-AE82-957C86814482}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ActorClient", "examples\GeneratedActor\ActorClient\ActorClient.csproj", "{61C24126-F39D-4BEA-96DC-FC87BA730554}" @@ -263,6 +265,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 + {310BD727-837D-47B2-83F2-C57E61B0DC36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {310BD727-837D-47B2-83F2-C57E61B0DC36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {310BD727-837D-47B2-83F2-C57E61B0DC36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {310BD727-837D-47B2-83F2-C57E61B0DC36}.Release|Any CPU.Build.0 = Release|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|Any CPU.Build.0 = Debug|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -348,6 +354,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} + {310BD727-837D-47B2-83F2-C57E61B0DC36} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {7592AFA4-426B-42F3-AE82-957C86814482} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {61C24126-F39D-4BEA-96DC-FC87BA730554} = {7592AFA4-426B-42F3-AE82-957C86814482} {CB903D21-4869-42EF-BDD6-5B1CFF674337} = {7592AFA4-426B-42F3-AE82-957C86814482} diff --git a/examples/Workflow/WorkflowSubWorkflow/Program.cs b/examples/Workflow/WorkflowSubWorkflow/Program.cs new file mode 100755 index 000000000..8fb8ad63d --- /dev/null +++ b/examples/Workflow/WorkflowSubWorkflow/Program.cs @@ -0,0 +1,66 @@ +using Dapr.Client; +using Dapr.Workflow; +using WorkflowSubWorkflow.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(); + options.RegisterWorkflow(); + }); +}); + +// 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)); +} + + +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: instanceId); + + await daprClient.WaitForWorkflowCompletionAsync( + workflowComponent: DaprWorkflowComponent, + instanceId: instanceId); + + GetWorkflowResponse state = await daprClient.GetWorkflowAsync( + instanceId: instanceId, + workflowComponent: DaprWorkflowComponent); + Console.WriteLine($"Workflow {instanceId} state: {state.RuntimeStatus}"); + + state = await daprClient.GetWorkflowAsync( + instanceId: instanceId + "-sub", + workflowComponent: DaprWorkflowComponent); + Console.WriteLine($"Workflow {instanceId} state: {state.RuntimeStatus}"); + +} \ No newline at end of file diff --git a/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj b/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj new file mode 100755 index 000000000..9acf06b47 --- /dev/null +++ b/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj @@ -0,0 +1,14 @@ + + + + + + + + Exe + net6 + enable + 612,618 + + + diff --git a/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs new file mode 100755 index 000000000..d0a982fdd --- /dev/null +++ b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs @@ -0,0 +1,15 @@ +using Dapr.Workflow; + +namespace WorkflowSubWorkflow.Workflows +{ + public class DemoSubWorkflow : Workflow + { + public override async Task RunAsync(WorkflowContext context, string input) + { + Console.WriteLine($"Workflow {context.InstanceId} Started."); + Console.WriteLine($"Received input: {input}."); + await context.CreateTimer(TimeSpan.FromSeconds(5)); + return true; + } + } +} diff --git a/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs new file mode 100755 index 000000000..54d25416c --- /dev/null +++ b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs @@ -0,0 +1,16 @@ +using Dapr.Workflow; + +namespace WorkflowSubWorkflow.Workflows +{ + public class DemoWorkflow : Workflow + { + public override async Task RunAsync(WorkflowContext context, string instanceId) + { + Console.WriteLine($"Workflow {instanceId} Started."); + string subInstanceId = instanceId + "-sub"; + ChildWorkflowTaskOptions options = new ChildWorkflowTaskOptions(subInstanceId); + await context.CallChildWorkflowAsync(nameof(DemoSubWorkflow), "Hello, sub-workflow", options); + return true; + } + } +}