Exemple #1
0
        /// <summary>
        /// Handles received <see cref="ActivityInvokeRequest"/> messages.
        /// </summary>
        /// <param name="client">The receiving Cadence client.</param>
        /// <param name="request">The request message.</param>
        /// <returns>The reply message.</returns>
        private static async Task <ActivityInvokeReply> OnActivityInvokeRequest(CadenceClient client, ActivityInvokeRequest request)
        {
            await SyncContext.Clear;

            ActivityRegistration invokeInfo;

            lock (syncLock)
            {
                if (!nameToRegistration.TryGetValue(GetActivityTypeKey(client, request.Activity), out invokeInfo))
                {
                    throw new KeyNotFoundException($"Cannot resolve [activityTypeName = {request.Activity}] to a registered activity type and activity method.");
                }
            }

            var activity = CreateNormal(client, invokeInfo, request.ContextId);

            try
            {
                var result = await activity.OnInvokeAsync(client, request.Args);

                if (activity.CompleteExternally)
                {
                    return(new ActivityInvokeReply()
                    {
                        Pending = true
                    });
                }
                else
                {
                    return(new ActivityInvokeReply()
                    {
                        Result = result,
                    });
                }
            }
            catch (CadenceException e)
            {
                activity.logger.LogError(e);

                return(new ActivityInvokeReply()
                {
                    Error = e.ToCadenceError()
                });
            }
            catch (TaskCanceledException e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = new CancelledException(e.Message).ToCadenceError()
                });
            }
            catch (Exception e)
            {
                activity.logger.LogError(e);

                return(new ActivityInvokeReply()
                {
                    Error = new CadenceError(e)
                });
            }
        }
Exemple #2
0
        /// <summary>
        /// Handles received <see cref="ActivityInvokeRequest"/> messages.
        /// </summary>
        /// <param name="client">The receiving Cadence client.</param>
        /// <param name="request">The request message.</param>
        /// <returns>The reply message.</returns>
        private static async Task <ActivityInvokeReply> OnActivityInvokeRequest(CadenceClient client, ActivityInvokeRequest request)
        {
            ActivityInvokeInfo invokeInfo;

            lock (syncLock)
            {
                if (!nameToInvokeInfo.TryGetValue(request.Activity, out invokeInfo))
                {
                    throw new KeyNotFoundException($"Cannot resolve [activityTypeName = {request.Activity}] to a registered activity type and activity method.");
                }
            }

            var activity = Create(client, invokeInfo, request.ContextId);

            try
            {
                var result = await activity.OnRunAsync(client, request.Args);

                return(new ActivityInvokeReply()
                {
                    Result = result
                });
            }
            catch (CadenceException e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = e.ToCadenceError()
                });
            }
            catch (TaskCanceledException e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = new CadenceCancelledException(e.Message).ToCadenceError()
                });
            }
            catch (CadenceActivityExternalCompletionException)
            {
                return(new ActivityInvokeReply()
                {
                    Pending = true
                });
            }
            catch (Exception e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = new CadenceError(e)
                });
            }
        }
Exemple #3
0
        /// <summary>
        /// Handles received <see cref="ActivityInvokeRequest"/> messages.
        /// </summary>
        /// <param name="request">The request message.</param>
        /// <returns>The reply message.</returns>
        private async Task <ActivityInvokeReply> OnActivityInvokeRequest(ActivityInvokeRequest request)
        {
            await SyncContext.Clear;

            ActivityRegistration invokeInfo;
            ActivityBase         activity;

            lock (nameToActivityRegistration)
            {
                if (!nameToActivityRegistration.TryGetValue(request.Activity, out invokeInfo))
                {
                    throw new KeyNotFoundException($"Cannot resolve [activityTypeName = {request.Activity}] to a registered activity type and activity method.");
                }

                activity = CreateNormalActivity(invokeInfo, request.ContextId);
                idToActivity.Add(request.ContextId, activity);
            }

            try
            {
                var result = await activity.OnInvokeAsync(request.Args);

                if (activity.CompleteExternally)
                {
                    return(new ActivityInvokeReply()
                    {
                        Pending = true
                    });
                }
                else
                {
                    return(new ActivityInvokeReply()
                    {
                        Result = result,
                    });
                }
            }
            catch (TemporalException e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = e.ToTemporalError()
                });
            }
            catch (TaskCanceledException e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = new CancelledException(e.Message).ToTemporalError()
                });
            }
            catch (Exception e)
            {
                return(new ActivityInvokeReply()
                {
                    Error = new TemporalError(e)
                });
            }
            finally
            {
                lock (idToActivity)
                {
                    idToActivity.Remove(activity.ContextId);
                }
            }
        }