private async Task SignalEntityAsyncInternal(DurableClient durableClient, string hubName, EntityId entityId, DateTime?scheduledTimeUtc, string operationName, object operationInput)
        {
            var entityKey = entityId.EntityKey;

            if (entityKey.Any(IsInvalidCharacter))
            {
                throw new ArgumentException(nameof(entityKey), "Entity keys must not contain /, \\, #, ?, or control characters.");
            }

            if (operationName == null)
            {
                throw new ArgumentNullException(nameof(operationName));
            }

            if (scheduledTimeUtc.HasValue)
            {
                scheduledTimeUtc = scheduledTimeUtc.Value.ToUniversalTime();
            }

            if (this.ClientReferencesCurrentApp(durableClient))
            {
                this.config.ThrowIfFunctionDoesNotExist(entityId.EntityName, FunctionType.Entity);
            }

            var guid       = Guid.NewGuid(); // unique id for this request
            var instanceId = EntityId.GetSchedulerIdFromEntityId(entityId);
            var instance   = new OrchestrationInstance()
            {
                InstanceId = instanceId
            };
            var request = new RequestMessage()
            {
                ParentInstanceId  = null, // means this was sent by a client
                ParentExecutionId = null,
                Id            = guid,
                IsSignal      = true,
                Operation     = operationName,
                ScheduledTime = scheduledTimeUtc,
            };

            if (operationInput != null)
            {
                request.SetInput(operationInput, this.messageDataConverter);
            }

            var jrequest  = JToken.FromObject(request, this.messageDataConverter.JsonSerializer);
            var eventName = scheduledTimeUtc.HasValue
                ? EntityMessageEventNames.ScheduledRequestMessageEventName(request.GetAdjustedDeliveryTime(this.durabilityProvider))
                : EntityMessageEventNames.RequestMessageEventName;
            await durableClient.client.RaiseEventAsync(instance, eventName, jrequest);

            this.traceHelper.FunctionScheduled(
                hubName,
                entityId.EntityName,
                EntityId.GetSchedulerIdFromEntityId(entityId),
                reason: $"EntitySignal:{operationName}",
                functionType: FunctionType.Entity,
                isReplay: false);
        }
Esempio n. 2
0
        /// <summary>
        /// Gets a <see cref="IDurableClient"/> using configuration from a <see cref="DurableClientAttribute"/> instance.
        /// </summary>
        /// <param name="attribute">The attribute containing the client configuration parameters.</param>
        /// <returns>Returns a <see cref="IDurableClient"/> instance. The returned instance may be a cached instance.</returns>
        protected internal virtual IDurableClient GetClient(DurableClientAttribute attribute)
        {
            DurableClient client = this.cachedClients.GetOrAdd(
                attribute,
                attr =>
            {
                DurabilityProvider innerClient = this.durabilityProviderFactory.GetDurabilityProvider(attribute);
                return(new DurableClient(innerClient, this, this.HttpApiHandler, attr));
            });

            return(client);
        }
        private bool ConnectionNameMatchesCurrentApp(DurableClient client)
        {
            var storageProvider = this.config.Options.StorageProvider;

            if (storageProvider.TryGetValue("ConnectionStringName", out object connectionName))
            {
                var newConnectionName = client.DurabilityProvider.ConnectionName;
                return(newConnectionName.Equals(connectionName));
            }

            return(false);
        }
        private OrchestrationStatusQueryResult ConvertFrom(DurableStatusQueryResult statusContext)
        {
            var results = new List <DurableOrchestrationStatus>();

            foreach (var state in statusContext.OrchestrationState)
            {
                results.Add(DurableClient.ConvertOrchestrationStateToStatus(state));
            }

            var result = new OrchestrationStatusQueryResult
            {
                DurableOrchestrationState = results,
                ContinuationToken         = statusContext.ContinuationToken,
            };

            return(result);
        }
 private bool ConnectionNameMatchesCurrentApp(DurableClient client)
 {
     return(this.DurabilityProvider.ConnectionNameMatches(client.DurabilityProvider));
 }
        private bool TaskHubMatchesCurrentApp(DurableClient client)
        {
            var taskHubName = this.durableTaskOptions.HubName;

            return(client.TaskHubName.Equals(taskHubName));
        }
 private bool ClientReferencesCurrentApp(DurableClient client)
 {
     return(!client.attribute.ExternalClient &&
            this.TaskHubMatchesCurrentApp(client) &&
            this.ConnectionNameMatchesCurrentApp(client));
 }
Esempio n. 8
0
 private bool ClientReferencesCurrentApp(DurableClient client)
 {
     return(this.TaskHubMatchesCurrentApp(client) && this.ConnectionNameMatchesCurrentApp(client));
 }
 /// <summary>
 /// Converts the DTFx representation of the orchestration state into the DF representation.
 /// </summary>
 /// <param name="orchestrationState">The orchestration state.</param>
 /// <returns>The orchestration status.</returns>
 public static DurableOrchestrationStatus ConvertOrchestrationStateToStatus(OrchestrationState orchestrationState)
 {
     return(DurableClient.ConvertOrchestrationStateToStatus(orchestrationState));
 }