public static async Task RestartService(this ServiceHost host, string orchestrationQualifiedName, OrchestrationInput inputArgs, string activityId) { await host.StopServiceAsync(orchestrationQualifiedName); await host.StartServiceAsync(orchestrationQualifiedName, inputArgs, activityId); }
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)); }