コード例 #1
0
        public JObject Heartbeat(ActivityTask task, int?progress = null, string message = null)
        {
            JToken progressData;

            task.Input.TryGetValue("progressData", out progressData);
            var heartbeatRequest = new
            {
                status = "heartbeat",
                progress,
                message,
                progressData
            };
            var json     = JsonConvert.SerializeObject(heartbeatRequest, Formatting.None);
            var content  = new StringContent(json, Encoding.UTF8);
            var response = client.PostAsync("tasks/" + task.TaskToken, content).Result;

            if (response.StatusCode != HttpStatusCode.OK)
            {
                logger.WarnFormat("HTTP Status code = {0} ({1})", Enum.GetName(typeof(HttpStatusCode), response.StatusCode), (int)response.StatusCode);
                return(null);
            }

            json = response.Content.ReadAsStringAsync().Result;
            return(JObject.Parse(json));
        }
コード例 #2
0
        /// <summary>
        /// Complete task sucessfully
        /// Use the JObject to create the task outputs
        /// </summary>
        /// <param name="task">Task</param>
        /// <param name="result">Result JSON object</param>
        protected void RespondSuccess(ActivityTask task, JObject result)
        {
            var successObj = new JObject(new JProperty("status", "success"),
                                         new JProperty("result", result));

            workflowClient.Respond(task, JsonConvert.SerializeObject(successObj, Formatting.None));
        }
コード例 #3
0
        /// <summary>
        /// Fetch the value of a single task input variable
        /// returns null if not present
        /// </summary>
        /// <param name="task">Task</param>
        /// <param name="name">Input name</param>
        /// <returns></returns>
        protected JToken GetInput(ActivityTask task, string name)
        {
            JToken input;

            task.Input.TryGetValue(name, out input);
            return(input);
        }
コード例 #4
0
        /// <summary>
        /// Override this to do real work
        /// </summary>
        /// <param name="task">Task</param>
        protected virtual void DoNotification(ActivityTask task)
        {
            // The dafault behaviour for notifications is to log and ignore them
            var type = GetInput(task, "type", "(Unknown type)");

            Console.WriteLine($"Notification, type = {type}");
        }
コード例 #5
0
 /// <summary>
 /// Override this to do real work
 /// </summary>
 /// <param name="task">Task</param>
 protected virtual void DoTask(ActivityTask task)
 {
     Task.Run(() =>
     {
         // Sample code for simple delaying activity with heartbeat and cancellation
         Console.WriteLine($"Starting activity, id = {task.ActivityId}");
         var delay = (int?)GetInput(task, "delay") ?? 50000;
         for (var progress = 0; progress < 100; progress += 10)
         {
             Thread.Sleep(delay / 10);
             var hb = workflowClient.Heartbeat(task, progress);
             if (hb == null)
             {
                 RespondFailure(task, "Heartbeat failed");
                 return;
             }
             if ((bool?)hb.SelectToken("cancellationRequested") == true)
             {
                 RespondCancelled(task);
                 return;
             }
         }
         var result = new JObject {
             ["output"] = 42
         };
         RespondSuccess(task, result);
     });
 }
コード例 #6
0
        public void SendSignal(ActivityTask task, WorkflowSignalledEvent signal)
        {
            var signalJson = JsonConvert.SerializeObject(signal);
            var content    = new StringContent(signalJson, Encoding.UTF8, "application/json");
            var url        = $"/executions/{task.ExecutionId}/signal";

            client.PostAsync(url, content);
        }
コード例 #7
0
        /// <summary>
        /// Signal for response from an asynchronous task
        /// </summary>
        /// <param name="task"></param>
        /// <param name="signalName"></param>
        protected void SignalCancelled(ActivityTask task, string signalName)
        {
            var signal = new WorkflowSignalledEvent
            {
                SignalName = signalName,
                Status     = "cancelled"
            };

            workflowClient.SendSignal(task, signal);
        }
コード例 #8
0
        /// <summary>
        /// Attempt to extract the required type of value from a variable with a default
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="task"></param>
        /// <param name="name"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        protected T GetInput <T>(ActivityTask task, string name, T defaultValue)
        {
            var value = GetInput(task, name);

            if (value == null)
            {
                return(defaultValue);
            }
            return(value.ToObject <T>());
        }
コード例 #9
0
        /// <summary>
        /// Attempt to extract the required type of value from a variable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="task"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        protected T GetInput <T>(ActivityTask task, string name)
        {
            var value = GetInput(task, name);

            if (value == null)
            {
                throw new ApplicationException($"Missing required value of input parameter: {name}");
            }
            return(value.ToObject <T>());
        }
コード例 #10
0
        /// <summary>
        /// Signal for response from an asynchronous task
        /// </summary>
        /// <param name="task"></param>
        /// <param name="signalName"></param>
        /// <param name="result"></param>
        protected void SignalSuccess(ActivityTask task, string signalName, JObject result)
        {
            var signal = new WorkflowSignalledEvent
            {
                SignalName = signalName,
                Status     = "success",
                Result     = result
            };

            workflowClient.SendSignal(task, signal);
        }
コード例 #11
0
        public void Respond(ActivityTask task, string json)
        {
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            logger.Info($"Responding with content - {json}");
            var response = client.PostAsync("/tasks/" + task.TaskToken, content).Result;

            if (response.StatusCode != HttpStatusCode.OK)
            {
                logger.WarnFormat("HTTP Status code = {0} ({1})", Enum.GetName(typeof(HttpStatusCode), response.StatusCode), (int)response.StatusCode);
            }
        }
コード例 #12
0
        /// <summary>
        /// Signal for response from an asynchronous task
        /// </summary>
        /// <param name="task"></param>
        /// <param name="signalName"></param>
        /// <param name="reason"></param>
        /// <param name="details"></param>
        protected void SignalFailure(ActivityTask task, string signalName, string reason, JObject details = null)
        {
            var signal = new WorkflowSignalledEvent
            {
                SignalName = signalName,
                Status     = "failure",
                Reason     = reason,
                Details    = details
            };

            workflowClient.SendSignal(task, signal);
        }
コード例 #13
0
        /// <summary>
        /// Responds with cancelled synchronously or asynchronously as appropriate
        /// </summary>
        /// <param name="task"></param>
        protected void Cancelled(ActivityTask task)
        {
            var signalName = GetInput <string>(task, "signalName");

            if (string.IsNullOrWhiteSpace(signalName))
            {
                RespondCancelled(task);
            }
            else
            {
                SignalCancelled(task, signalName);
            }
        }
コード例 #14
0
        /// <summary>
        /// Responds with failure synchronously or asynchronously as appropriate
        /// </summary>
        /// <param name="task"></param>
        /// <param name="reason"></param>
        /// <param name="details"></param>
        protected void Failure(ActivityTask task, string reason, JObject details = null)
        {
            var signalName = GetInput <string>(task, "signalName");

            if (string.IsNullOrWhiteSpace(signalName))
            {
                RespondFailure(task, reason, details);
            }
            else
            {
                SignalFailure(task, signalName, reason, details);
            }
        }
コード例 #15
0
        /// <summary>
        /// Responds with success synchronously or asynchronously as appropriate
        /// </summary>
        /// <param name="task"></param>
        /// <param name="result"></param>
        protected void Success(ActivityTask task, JObject result)
        {
            var signalName = GetInput <string>(task, "signalName");

            if (string.IsNullOrWhiteSpace(signalName))
            {
                RespondSuccess(task, result);
            }
            else
            {
                SignalSuccess(task, signalName, result);
            }
        }
コード例 #16
0
        /// <summary>
        /// Complete task sucessfully
        /// Use the reponse object to create the outputs
        /// The response object will usually be an anonymous object
        /// </summary>
        /// <param name="task">Task</param>
        /// <param name="result">Result object</param>
        protected void RespondSuccess(ActivityTask task, object result)
        {
            string json;

            try
            {
                json = JsonConvert.SerializeObject(result, Formatting.None);
            }
            catch (Exception)
            {
                RespondFailure(task, "Invalid JSON response object");
                return;
            }
            RespondSuccess(task, json);
        }
コード例 #17
0
        protected void RespondRescheduled(ActivityTask task)
        {
            var cancelObj = new { status = "rescheduled" };

            workflowClient.Respond(task, JsonConvert.SerializeObject(cancelObj, Formatting.None));
        }
コード例 #18
0
        /// <summary>
        /// Complete task sucessfully with no result
        /// </summary>
        /// <param name="task"></param>
        protected void RespondSuccess(ActivityTask task)
        {
            var successObj = new JObject();

            RespondSuccess(task, successObj);
        }
コード例 #19
0
 /// <summary>
 /// Complete task sucessfully
 /// Use the supplied text as the result
 /// </summary>
 /// <param name="task">Task</param>
 /// <param name="jsonObjectResult">Result text</param>
 protected void RespondSuccess(ActivityTask task, string jsonObjectResult)
 {
     RespondSuccess(task, JObject.Parse(jsonObjectResult));
 }
コード例 #20
0
        /// <summary>
        /// Complete task with failure
        /// </summary>
        /// <param name="task">Task</param>
        /// <param name="reason">Reason string</param>
        /// <param name="details">JSON details object</param>
        protected void RespondFailure(ActivityTask task, string reason, JToken details = null)
        {
            var failObj = new { status = "failure", reason, details };

            workflowClient.Respond(task, JsonConvert.SerializeObject(failObj, Formatting.None));
        }