elsa-workflows / elsa-workflows/elsa-core
Finish activity does not work as expected
- Dominant language
- C#
- Stars
- 7.9k
- Forks
- 1.5k
- Avg merge
- 15h 22m
- Merged PRs (30d)
- 114
Description
I created a self defined activity.I want finished the workflow when i step into branch 'reject'.
Here is my activity:
```c#
public class SelfActivity : CompositeActivity
{
[ActivityInput]
public string Start
{
get => GetState();
set => SetState(value);
}
public override void Build(ICompositeActivityBuilder builder)
{
builder.Then(act => act.WithBranches($"appr", $"reject", $"remind"), fork =>
{
fork.When($"remind").WriteHttpResponse(HttpStatusCode.OK, "ok", "text/html");
fork.When($"reject").WriteLine(ctx =>
{
return $"reject:{ctx.GenerateSignalUrl($"{Start}_reject")}";
}).SignalReceived((ctx) => {
return $"{Start}_reject";
}).SetVariable($"result", "0").ThenNamed($"join");
fork.When($"appr").WriteLine(ctx =>
{
return $"appr:{ctx.GenerateSignalUrl($"{Start}_appr")}";
}).SignalReceived((ctx) => $"{Start}_appr").SetVariable($"result", "1").ThenNamed($"join");
})
.Add(join =>
{
join.WithMode(Join.JoinMode.WaitAny);
}).WithName($"join")
.If((ctx) => ctx.GetVariable($"result") == "1", @if =>
{
@if
.When(Elsa.OutcomeNames.True)
.WriteLine(context => $"approved!`");
@if
.When(Elsa.OutcomeNames.False)
.WriteLine(context => $"rejected!`").Finish();
//.WriteLine(context => $"rejected!`").Finish(GetFinish);
});
}
private static async ValueTask> GetFinish(ActivityExecutionContext context)
{
var parentBlueprint = context.ActivityBlueprint.Parent;
// Remove any blocking activities within the scope of the composite activity.
var blockingActivities = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities;
var blockingActivityIds = blockingActivities.Select(x => x.ActivityId).ToList();
var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList();
var containedBlockingActivities = blockingActivities.Where(x => containedBlockingActivityIds.Contains(x.ActivityId));
foreach (var blockingActivity in containedBlockingActivities)
await context.WorkflowExecutionContext.RemoveBlockingActivityAsync(blockingActivity);
// Evict & remove any scope activities within the scope of the composite activity.
var scopes = context.WorkflowInstance.Scopes.Select(x => x).Reverse().ToList();
var scopeIds = scopes.Select(x => x.ActivityId).ToList();
var containedScopeActivityIds = parentBlueprint == null ? scopeIds : parentBlueprint.Activities.Where(x => scopeIds.Contains(x.Id)).Select(x => x.Id).ToList();
foreach (var scopeId in containedScopeActivityIds)
{
var scopeActivity = context.WorkflowExecutionContext.GetActivityBlueprintById(scopeId)!;
await context.WorkflowExecutionContext.EvictScopeAsync(scopeActivity);
scopes.RemoveAll(x => x.ActivityId == scopeId);
}
context.WorkflowInstance.Scopes = new Elsa.Models.SimpleStack();
return new List { "Done" };
}
}
public static class SelfActivityExtension {
public static ISetupActivity WithStart(this ISetupActivity setup, Func> value) => setup.Set(x => x.Start, value);
}
```
```c#
public class DocumentApprovalWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder.HttpEndpoint("/test6")
.Then(x => {
x.WithStart(ctx =>new ValueTask("test3"));
}, x => { })
.Then(x => {
x.WithStart(ctx => new ValueTask("test4"));
}, x => { })
.WriteLine("finished");
}
}
```
Contributor guide
Assessment
This issue has not been assessed yet.