public static async Task RestartService(this ServiceHost host, string orchestrationQualifiedName,
                                                OrchestrationInput inputArgs, string activityId)
        {
            await host.StopServiceAsync(orchestrationQualifiedName);

            await host.StartServiceAsync(orchestrationQualifiedName, inputArgs, activityId);
        }
Beispiel #2
0
        public static void RestartService(this ServiceHost host, string orchestrationQualifiedName,
                                          OrchestrationInput inputArgs, string activityId)
        {
            host.StopService(orchestrationQualifiedName);

            host.StartService(orchestrationQualifiedName, inputArgs, activityId);
        }
        public static async Task StartServiceAsync(this ServiceHost host, string orchestrationQualifiedName,
                                                   OrchestrationInput inputArgs, string activityId)
        {
            var tp = Type.GetType(orchestrationQualifiedName);

            if (tp == null)
            {
                throw new ArgumentException(String.Format("Cannot lookup type '{0} ", orchestrationQualifiedName));
            }

            Microservice config = ServiceHost.GetServiceConfiguration(String.Empty, tp);

            var svcCfg = config.ServiceConfiguration as OrchestrationConfig;

            if (svcCfg == null)
            {
                throw new ArgumentException(String.Format("Specified orchestration configuration is not of type 'OrchestrationConfig'. Failed by starting of '{1}' - Specified (invalid) configuration type: '{2}'.", orchestrationQualifiedName, config));
            }

            if (!String.IsNullOrEmpty(svcCfg.LogTraceSourceName))
            {
                foreach (var item in config.ActivityConfiguration)
                {
                    TaskConfig cfg = item.Value as TaskConfig;

                    //
                    // We can have configuration, which is not of type of TaskConfig.
                    if (cfg != null)
                    {
                        if (String.IsNullOrEmpty(cfg.LogTraceSourceName))
                        {
                            cfg.LogTraceSourceName = svcCfg.LogTraceSourceName;
                        }
                    }
                }
            }

            //
            // Generate new Guid if not set
            if (String.IsNullOrEmpty(activityId))
            {
                activityId = Guid.NewGuid().ToString();
            }

            inputArgs.Context = new Dictionary <string, object>();
            var logCtx = new LoggingContext();

            logCtx.LoggingScopes = new Dictionary <string, string>();
            logCtx.LoggingScopes.Add("ActivityId", activityId);
            inputArgs.Context.Add("Orchestration", config.Type.FullName);
            inputArgs.Context.Add("ParentLoggingContext", logCtx);


            await host.StartServiceAsync(orchestrationQualifiedName, inputArgs);
        }
 /// <summary>
 ///  Create a suborchestration of the specified type. Also retry on failure as
 ///  per supplied policy.
 ///  It transfers the input orchestration context to the new orchestration.
 ///  </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="orchestrationType"></param>
 /// <param name="retryOptions"></param>
 /// <param name="input"></param>
 /// <returns></returns>
 public async Task <T> CreateSubOrchestrationInstanceWithRetry <T>(Type orchestrationType, RetryOptions retryOptions, OrchestrationInput input)
 {
     input.Context = m_OrchestrationInput.Context;
     return(await m_OrchestrationConext.CreateSubOrchestrationInstanceWithRetry <T>(orchestrationType,
                                                                                    retryOptions, input));
 }
        public static async Task <HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
            [OrchestrationClient] DurableOrchestrationClient starter,
            TraceWriter log)
        {
            // Determine path
            var orchestrationInput = new OrchestrationInput();

            var query      = req.RequestUri.ParseQueryString();
            var instanceId = query["instanceId"];

            if (string.IsNullOrEmpty(instanceId))
            {
                log.Error("*** instanceId querystring value missing");
                return(req.CreateResponse(HttpStatusCode.BadRequest, "instanceId querystring value missing", new JsonMediaTypeFormatter()));
            }

            var idString = query["id"];

            if (string.IsNullOrEmpty(instanceId))
            {
                log.Error("*** id querystring value missing");
                return(req.CreateResponse(HttpStatusCode.BadRequest, "id querystring value missing", new JsonMediaTypeFormatter()));
            }
            if (int.TryParse(idString, out int id))
            {
                orchestrationInput.Id = id;
            }
            else
            {
                log.Error("*** couldn't parse id querystring value");
                return(req.CreateResponse(HttpStatusCode.BadRequest, "couldn't parse id querystring value", new JsonMediaTypeFormatter()));
            }

            var waitTimeInMillisecondsString = query["wait"];

            if (string.IsNullOrEmpty(instanceId))
            {
                log.Error("*** wait querystring value missing");
                return(req.CreateResponse(HttpStatusCode.BadRequest, "wait querystring value missing", new JsonMediaTypeFormatter()));
            }
            if (int.TryParse(waitTimeInMillisecondsString, out int waitTimeInMilliseconds))
            {
                orchestrationInput.WaitTimeInMilliseconds = waitTimeInMilliseconds;
            }
            else
            {
                log.Error("*** couldn't parse wait querystring value");
                return(req.CreateResponse(HttpStatusCode.BadRequest, "couldn't parse wait querystring value", new JsonMediaTypeFormatter()));
            }


            // Find or start an orchestration instance
            log.Info($"*** TRIGGER {instanceId}, {id}: Looking up instance");
            var status = await starter.GetStatusAsync(instanceId);

            if (status == null)
            {
                log.Info($"*** TRIGGER {instanceId}, {id}: no instance found - starting...");
                await starter.StartNewAsync("StorageBatches", instanceId, orchestrationInput);

                log.Info($"*** TRIGGER {instanceId}, {id}: Started new orchestration");
            }
            else
            {
                log.Info($"*** TRIGGER {instanceId}, {id}: Got existing instance (name {status.Name}). status {status.RuntimeStatus})");
            }

            return(starter.CreateCheckStatusResponse(req, instanceId));
        }