/// <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) }); } }
/// <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) }); } }
/// <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); } } }