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