Add timeout outcome to SendHttpRequest activities

Issue #4456
This commit is contained in:
Sipke Schoorstra 2023-09-18 15:56:38 +02:00
parent ef0022b610
commit cb4637fe19
3 changed files with 25 additions and 1 deletions

View file

@ -42,11 +42,17 @@ public class FlowSendHttpRequest : SendHttpRequestBase
await context.CompleteActivityWithOutcomesAsync("Failed to connect");
}
/// <inheritdoc />
protected override async ValueTask HandleTaskCanceledExceptionAsync(ActivityExecutionContext context, TaskCanceledException exception)
{
await context.CompleteActivityWithOutcomesAsync("Timeout");
}
private static ValueTask<IDictionary<string, object>> GetExpectedStatusCodesOptionsAsync(PropertyInfo property, CancellationToken cancellationToken = default)
{
var options = new Dictionary<string, object>
{
[nameof(DynamicOutcomesOptions)] = new DynamicOutcomesOptions(new[]{"Unmatched status code", "Failed to connect", "Done"})
[nameof(DynamicOutcomesOptions)] = new DynamicOutcomesOptions(new[]{"Unmatched status code", "Failed to connect", "Timeout", "Done"})
};
return new(options);

View file

@ -37,6 +37,11 @@ public class SendHttpRequest : SendHttpRequestBase
/// The activity to execute when the HTTP request fails to connect.
/// </summary>
public IActivity? FailedToConnect { get; set; }
/// <summary>
/// The activity to execute when the HTTP request times out.
/// </summary>
public IActivity? Timeout { get; set; }
/// <inheritdoc />
protected override async ValueTask HandleResponseAsync(ActivityExecutionContext context, HttpResponseMessage response)
@ -55,6 +60,12 @@ public class SendHttpRequest : SendHttpRequestBase
await context.ScheduleActivityAsync(FailedToConnect, OnChildActivityCompletedAsync);
}
/// <inheritdoc />
protected override async ValueTask HandleTaskCanceledExceptionAsync(ActivityExecutionContext context, TaskCanceledException exception)
{
await context.ScheduleActivityAsync(Timeout, OnChildActivityCompletedAsync);
}
private async ValueTask OnChildActivityCompletedAsync(ActivityCompletedContext context)
{
await context.TargetContext.CompleteActivityAsync();

View file

@ -88,6 +88,11 @@ public abstract class SendHttpRequestBase : Activity<HttpResponseMessage>
/// Handles an exception that occurred while sending the request.
/// </summary>
protected abstract ValueTask HandleRequestExceptionAsync(ActivityExecutionContext context, HttpRequestException exception);
/// <summary>
/// Handles <see cref="TaskCanceledException"/> that occurred while sending the request.
/// </summary>
protected abstract ValueTask HandleTaskCanceledExceptionAsync(ActivityExecutionContext context, TaskCanceledException exception);
private async Task TrySendAsync(ActivityExecutionContext context)
{
@ -113,7 +118,9 @@ public abstract class SendHttpRequestBase : Activity<HttpResponseMessage>
}
catch (TaskCanceledException e)
{
context.AddExecutionLogEntry("Error", e.Message, payload: new { StackTrace = e.StackTrace });
context.JournalData.Add("Cancelled", true);
await HandleTaskCanceledExceptionAsync(context, e);
}
}