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);
        }
示例#2
0
        internal void RescheduleMessages(OrchestrationContext innerContext, List <RequestMessage> messages)
        {
            if (messages != null)
            {
                foreach (var message in messages)
                {
                    var instance = new OrchestrationInstance {
                        InstanceId = this.InstanceId
                    };
                    DateTime adjustedDeliveryTime = message.GetAdjustedDeliveryTime(this.durabilityProvider);
                    var      eventName            = EntityMessageEventNames.ScheduledRequestMessageEventName(adjustedDeliveryTime);
                    innerContext.SendEvent(instance, eventName, message);
                }

                messages.Clear();
            }
        }
        private async Task SignalEntityAsyncInternal(TaskHubClient client, string hubName, EntityId entityId, DateTime?scheduledTimeUtc, string operationName, object operationInput)
        {
            if (operationName == null)
            {
                throw new ArgumentNullException(nameof(operationName));
            }

            if (this.client.Equals(client))
            {
                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(scheduledTimeUtc.Value) : EntityMessageEventNames.RequestMessageEventName;
            await client.RaiseEventAsync(instance, eventName, jrequest);

            this.traceHelper.FunctionScheduled(
                hubName,
                entityId.EntityName,
                EntityId.GetSchedulerIdFromEntityId(entityId),
                reason: $"EntitySignal:{operationName}",
                functionType: FunctionType.Entity,
                isReplay: false);
        }
示例#4
0
        internal void SendEntityMessage(OrchestrationInstance target, object eventContent)
        {
            string eventName;

            if (eventContent is RequestMessage requestMessage)
            {
                if (requestMessage.ScheduledTime.HasValue)
                {
                    eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(requestMessage.ScheduledTime.Value);
                }
                else
                {
                    this.MessageSorter.LabelOutgoingMessage(
                        requestMessage,
                        target.InstanceId,
                        this.InnerContext.CurrentUtcDateTime,
                        TimeSpan.FromMinutes(this.Config.Options.EntityMessageReorderWindowInMinutes));

                    eventName = EntityMessageEventNames.RequestMessageEventName;
                }
            }
            else
            {
                eventName = EntityMessageEventNames.ReleaseMessageEventName;
            }

            if (!this.IsReplaying)
            {
                this.Config.TraceHelper.SendingEntityMessage(
                    this.InstanceId,
                    this.ExecutionId,
                    target.InstanceId,
                    eventName,
                    eventContent);
            }

            this.IncrementActionsOrThrowException();
            this.InnerContext.SendEvent(target, eventName, eventContent);
        }
示例#5
0
        internal void SendOperationMessage(OrchestrationInstance target, RequestMessage requestMessage)
        {
            lock (this.outbox)
            {
                string eventName;

                if (requestMessage.ScheduledTime.HasValue)
                {
                    eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(requestMessage.ScheduledTime.Value);
                }
                else
                {
                    eventName = EntityMessageEventNames.RequestMessageEventName;
                }

                this.outbox.Add(new OperationMessage()
                {
                    Target       = target,
                    EventName    = eventName,
                    EventContent = requestMessage,
                });
            }
        }
示例#6
0
        internal void SendOperationMessage(OrchestrationInstance target, RequestMessage requestMessage)
        {
            lock (this.outbox)
            {
                string eventName;

                if (requestMessage.ScheduledTime.HasValue)
                {
                    DateTime adjustedDeliveryTime = requestMessage.GetAdjustedDeliveryTime(this.durabilityProvider);
                    eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(adjustedDeliveryTime);
                }
                else
                {
                    eventName = EntityMessageEventNames.RequestMessageEventName;
                }

                this.outbox.Add(new OperationMessage()
                {
                    Target       = target,
                    EventName    = eventName,
                    EventContent = requestMessage,
                });
            }
        }
示例#7
0
        internal void SendOperationMessage(OrchestrationInstance target, RequestMessage requestMessage)
        {
            lock (this.outbox)
            {
                string eventName;

                if (requestMessage.ScheduledTime.HasValue)
                {
                    eventName = EntityMessageEventNames.ScheduledRequestMessageEventName(requestMessage.ScheduledTime.Value);
                }
                else
                {
                    this.State.MessageSorter.LabelOutgoingMessage(requestMessage, target.InstanceId, DateTime.UtcNow, this.EntityMessageReorderWindow);
                    eventName = EntityMessageEventNames.RequestMessageEventName;
                }

                this.outbox.Add(new OperationMessage()
                {
                    Target       = target,
                    EventName    = eventName,
                    EventContent = requestMessage,
                });
            }
        }