Example #1
0
        public static IServiceCollection AddDurableTaskClient(
            this IServiceCollection services)
        {
            services.TryAddSingleton(serviceProvider =>
            {
                var orchestrationServiceClient = serviceProvider.GetRequiredService <IOrchestrationServiceClient>();
                var jsonDataConverter          = new TypelessJsonDataConverter();
                var loggerFactory = serviceProvider.GetService <ILoggerFactory>();
                return(new TaskHubClient(orchestrationServiceClient, jsonDataConverter, loggerFactory));
            });

            return(services);
        }
Example #2
0
        protected TaskMessage[] GetOrchestrationMessages(string instanceId)
        {
            var dbContextFactory = _host.Services.GetRequiredService <Func <OrchestrationDbContext> >();

            using (var dbContext = dbContextFactory())
            {
                var dataConverter = new TypelessJsonDataConverter();

                return(dbContext.OrchestrationMessages
                       .OrderBy(m => m.AvailableAt)
                       .ThenBy(m => m.SequenceNumber)
                       .Select(m => dataConverter.Deserialize <TaskMessage>(m.Message))
                       .ToArray());
            }
        }
 public ActivityBase()
 {
     DataConverter = new TypelessJsonDataConverter();
 }
 public OrchestrationBase()
 {
     DataConverter = new TypelessJsonDataConverter();
 }
Example #5
0
        public static IReadOnlyList <IEndpointConventionBuilder> MapOrchestrationEndpoints(
            this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder builder,
            PathString prefix)
        {
            var endpoints = new List <IEndpointConventionBuilder>();

            endpoints.Add(builder.MapGet(prefix + "/v1/orchestrations", async context =>
            {
                var extendedOrchestrationServiceClient = context.RequestServices.GetRequiredService <IExtendedOrchestrationServiceClient>();

                var query = context.ParseQuery <OrchestrationQuery>();

                var result = await extendedOrchestrationServiceClient.GetOrchestrationsAsync(query);

                await context.RespondJson(result);
            }).RequireAuthorization(DurableTaskPolicy.Read).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsList"
            }));

            endpoints.Add(builder.MapPost(prefix + "/v1/orchestrations", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();
                var linkGenerator = context.RequestServices.GetRequiredService <LinkGenerator>();

                var request = await context.ParseBody <CreateOrchestrationRequest>();

                var validationResults = new List <ValidationResult>();
                if (!Validator.TryValidateObject(request, new ValidationContext(request), validationResults))
                {
                    await context.RespondJson(validationResults, 400);
                    return;
                }

                var instance = await taskHubClient.CreateOrchestrationInstanceAsync(
                    request.Name,
                    request.Version ?? string.Empty,
                    request.InstanceId,
                    request.Input,
                    request.Tags);

                var typedHeaders      = context.Response.GetTypedHeaders();
                typedHeaders.Location = new Uri(linkGenerator.GetUriByName("DurableTaskApi_OrchestrationsGet", new
                {
                    instanceId = instance.InstanceId
                }, context.Request.Scheme, context.Request.Host, context.Request.PathBase));

                await context.RespondJson(instance, 201);
            }).RequireAuthorization(DurableTaskPolicy.Create).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsCreate"
            }));

            endpoints.Add(builder.MapGet(prefix + "/v1/orchestrations/{instanceId}", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();

                var instanceId = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());

                var state = await taskHubClient.GetOrchestrationStateAsync(instanceId);

                if (state == null)
                {
                    context.Response.StatusCode = 404;
                    return;
                }

                await context.RespondJson(state);
            }).RequireAuthorization(DurableTaskPolicy.Read)
                          .WithMetadata(new EndpointNameMetadata("DurableTaskApi_OrchestrationsGet"))
                          .WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsGet"
            }));

            endpoints.Add(builder.MapGet(prefix + "/v1/orchestrations/{instanceId}/{executionId}", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();

                var instanceId  = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());
                var executionId = Uri.UnescapeDataString(context.Request.RouteValues["executionId"].ToString());

                var state = await taskHubClient.GetOrchestrationStateAsync(instanceId, executionId);

                if (state == null)
                {
                    context.Response.StatusCode = 404;
                    return;
                }

                await context.RespondJson(state);
            }).RequireAuthorization(DurableTaskPolicy.Read)
                          .WithMetadata(new EndpointNameMetadata("DurableTaskApi_OrchestrationsGetExecution"))
                          .WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsGetExecution"
            }));

            endpoints.Add(builder.MapGet(prefix + "/v1/orchestrations/{instanceId}/{executionId}/history", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();

                var instanceId  = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());
                var executionId = Uri.UnescapeDataString(context.Request.RouteValues["executionId"].ToString());

                var orchestrationInstance = new OrchestrationInstance
                {
                    InstanceId  = instanceId,
                    ExecutionId = executionId
                };

                var history = await taskHubClient.GetOrchestrationHistoryAsync(orchestrationInstance);

                var events = new TypelessJsonDataConverter().Deserialize <HistoryEvent[]>(history);

                await context.RespondJson(events);
            }).RequireAuthorization(DurableTaskPolicy.ReadHistory).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsGetExecutionHistory"
            }));

            endpoints.Add(builder.MapPost(prefix + "/v1/orchestrations/{instanceId}/terminate", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();

                var instanceId = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());

                var orchestrationInstance = new OrchestrationInstance
                {
                    InstanceId = instanceId
                };

                var request = await context.ParseBody <TerminateRequest>();

                await taskHubClient.TerminateInstanceAsync(orchestrationInstance, request.Reason);

                await context.RespondJson(new { });
            }).RequireAuthorization(DurableTaskPolicy.Terminate).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsTerminate"
            }));

            endpoints.Add(builder.MapPost(prefix + "/v1/orchestrations/{instanceId}/rewind", async context =>
            {
                var extendedOrchestrationServiceClient = context.RequestServices.GetRequiredService <IExtendedOrchestrationServiceClient>();

                var instanceId = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());

                var request = await context.ParseBody <RewindRequest>();

                await extendedOrchestrationServiceClient.RewindTaskOrchestrationAsync(instanceId, request.Reason);

                await context.RespondJson(new { });
            }).RequireAuthorization(DurableTaskPolicy.Rewind).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsRewind"
            }));

            endpoints.Add(builder.MapPost(prefix + "/v1/orchestrations/{instanceId}/raiseevent/{eventName}", async context =>
            {
                var taskHubClient = context.RequestServices.GetRequiredService <TaskHubClient>();

                var instanceId = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());
                var eventName  = Uri.UnescapeDataString(context.Request.RouteValues["eventName"].ToString());

                var orchestrationInstance = new OrchestrationInstance
                {
                    InstanceId = instanceId
                };

                var eventData = await context.ParseBody <JToken>();

                await taskHubClient.RaiseEventAsync(orchestrationInstance, eventName, eventData);

                await context.RespondJson(new { });
            }).RequireAuthorization(DurableTaskPolicy.RaiseEvent).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsRaiseEvent"
            }));

            endpoints.Add(builder.MapDelete(prefix + "/v1/orchestrations/{instanceId}", async context =>
            {
                var extendedOrchestrationServiceClient = context.RequestServices.GetRequiredService <IExtendedOrchestrationServiceClient>();

                var instanceId = Uri.UnescapeDataString(context.Request.RouteValues["instanceId"].ToString());

                var result = await extendedOrchestrationServiceClient.PurgeInstanceHistoryAsync(instanceId);

                await context.RespondJson(new { });
            }).RequireAuthorization(DurableTaskPolicy.Purge).WithMetadata(new DurableTaskEndpointMetadata
            {
                Id = "OrchestrationsPurgeInstance"
            }));

            return(endpoints);
        }