Skip to content

Commit

Permalink
add fan-out-fan-in sample
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 1578c53
Show file tree
Hide file tree
Showing 5 changed files with 109 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\WorkflowFanOutFanIn\WorkflowFanOutFanIn.csproj", "{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA}"
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
{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA}.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}
{A33BADFD-3BCE-47A4-89A5-1F26CC801DFA} = {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/WorkflowFanOutFanIn/Activities/NotifyActivity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Dapr.Workflow;

namespace WorkflowFanOutFanIn.Activities
{
public class NotifyActivity : WorkflowActivity<string, object>
{
public override Task<object> RunAsync(WorkflowActivityContext context, string message)
{
Console.WriteLine(message);
return Task.FromResult<object>(null);
}
}
}
54 changes: 54 additions & 0 deletions examples/Workflow/WorkflowFanOutFanIn/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using Dapr.Client;
using Dapr.Workflow;
using WorkflowFanOutFanIn.Activities;
using WorkflowFanOutFanIn.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<NotifyActivity>();
});
});

// 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)
{
await daprClient.WaitForSidecarAsync();

string instanceId = $"demo-workflow-{Guid.NewGuid().ToString()[..8]}";
await daprClient.StartWorkflowAsync(
workflowComponent: DaprWorkflowComponent,
workflowName: nameof(DemoWorkflow),
instanceId: instanceId,
input: "test input");


await daprClient.WaitForWorkflowCompletionAsync(
workflowComponent: DaprWorkflowComponent,
instanceId: instanceId);
}
14 changes: 14 additions & 0 deletions examples/Workflow/WorkflowFanOutFanIn/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>
21 changes: 21 additions & 0 deletions examples/Workflow/WorkflowFanOutFanIn/Workflows/DemoWorkflow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Dapr.Workflow;
using WorkflowFanOutFanIn.Activities;

namespace WorkflowFanOutFanIn.Workflows
{
public class DemoWorkflow : Workflow<string, string>
{
public override async Task<string> RunAsync(WorkflowContext context, string input)
{
Console.WriteLine("Workflow Started.");

Task t1 = context.CallActivityAsync(nameof(NotifyActivity), "calling task 1 ...");
Task t2 = context.CallActivityAsync(nameof(NotifyActivity), "calling task 2 ...");
Task t3 = context.CallActivityAsync(nameof(NotifyActivity), "calling task 3 ...");
await Task.WhenAll(t1, t2, t3);

Console.WriteLine("Workflow Completed.");
return "Workflow Completed.";
}
}
}

0 comments on commit 1578c53

Please sign in to comment.