async Task Execute(BehaviorContext <TInstance> context)
        {
            Guid?previousTokenId = _schedule.GetTokenId(context.Instance);

            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var schedulerContext = context.GetPayload <MessageSchedulerContext>();

            var message = _messageFactory?.Invoke(consumeContext) ?? await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            var delay = _timeProvider(consumeContext);

            ScheduledMessage <TMessage> scheduledMessage = await schedulerContext.ScheduleSend(delay, message, _sendPipe).ConfigureAwait(false);

            _schedule?.SetTokenId(context.Instance, scheduledMessage.TokenId);

            if (previousTokenId.HasValue)
            {
                Guid?messageTokenId = consumeContext.GetSchedulingTokenId();
                if (!messageTokenId.HasValue || previousTokenId.Value != messageTokenId.Value)
                {
                    await schedulerContext.CancelScheduledSend(consumeContext.ReceiveContext.InputAddress, previousTokenId.Value).ConfigureAwait(false);
                }
            }
        }
 private static CalculateCommand CreateCalculationCommand <TData>(ConsumeEventContext <CalculationInstance, TData> context)
     where TData : class
 {
     return(new CalculateCommand {
         Id = context.Instance.Id
     });
 }
 protected override Task <OrderCompleted> CreateCompleted(ConsumeEventContext <FutureState, OrderLineCompleted> context)
 {
     return(Init <OrderLineCompleted, OrderCompleted>(context, new
     {
         LinesCompleted = context.Instance.Results.Select(x => x.Value.ToObject <OrderLineCompleted>()).ToDictionary(x => x.OrderLineId),
     }));
 }
Exemple #4
0
        public async Task Execute(BehaviorContext <TInstance, TData> context, Behavior <TInstance, TData> next)
        {
            ConsumeEventContext <TInstance, TData> consumeContext = context.CreateConsumeContext();

            var payload = context.Data as Fault;

            InitializeContext <RequestFaulted <TRequest> > initializeContext = await MessageInitializerCache <RequestFaulted <TRequest> > .Initialize(new
            {
                context.Instance.CorrelationId,
                PayloadType = TypeMetadataCache <Fault <TRequest> > .MessageTypeNames,
                Payload     = new
                {
                    payload.FaultId,
                    payload.FaultedMessageId,
                    payload.Timestamp,
                    payload.Host,
                    payload.Exceptions
                }
            }).ConfigureAwait(false);

            object message = initializeContext.Message;

            await consumeContext.Publish(message, typeof(RequestFaulted)).ConfigureAwait(false);

            await next.Execute(context).ConfigureAwait(false);
        }
Exemple #5
0
        protected async Task <T> Init <TData, T>(ConsumeEventContext <FutureState, TData> context, object values = default)
            where TData : class
            where T : class
        {
            InitializeContext <T> initializeContext = await MessageInitializerCache <T> .Initialize(context.Data, context.CancellationToken);

            initializeContext = await MessageInitializerCache <T> .Initialize(initializeContext, new
            {
                context.Instance.Canceled,
                context.Instance.Completed,
                context.Instance.Created,
                context.Instance.Deadline,
                context.Instance.Faulted,
                context.Instance.Location,
            });

            var request = context.Instance.GetRequest <TRequest>();

            if (request != null)
            {
                initializeContext = await MessageInitializerCache <T> .Initialize(initializeContext, request);
            }

            if (values != null)
            {
                initializeContext = await MessageInitializerCache <T> .Initialize(initializeContext, values);
            }

            return(initializeContext.Message);
        }
Exemple #6
0
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = _messageFactory?.Invoke(consumeContext) ?? await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            IPipe <SendContext <TMessage> > sendPipe = _contextCallback != null
                ? Pipe.Execute <SendContext <TMessage> >(sendContext =>
            {
                _contextCallback(consumeContext, sendContext);
            })
                : Pipe.Empty <SendContext <TMessage> >();

            if (_destinationAddressProvider != null)
            {
                var destinationAddress = _destinationAddressProvider(consumeContext);

                var endpoint = await consumeContext.GetSendEndpoint(destinationAddress).ConfigureAwait(false);


                await endpoint.Send(message, sendPipe).ConfigureAwait(false);
            }
            else
            {
                await consumeContext.Send(message, sendPipe).ConfigureAwait(false);
            }
        }
Exemple #7
0
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            MessageSchedulerContext schedulerContext;

            if (!((ConsumeContext)consumeContext).TryGetPayload(out schedulerContext))
            {
                throw new ContextException("The scheduler context could not be retrieved.");
            }

            var message = _messageFactory(consumeContext);

            var delay = _delayProvider(consumeContext);

            ScheduledMessage <TMessage> scheduledMessage = await schedulerContext.ScheduleSend(delay, message, _sendPipe).ConfigureAwait(false);

            Guid?previousTokenId = _schedule.GetTokenId(context.Instance);

            if (previousTokenId.HasValue)
            {
                await schedulerContext.CancelScheduledSend(previousTokenId.Value).ConfigureAwait(false);
            }

            _schedule?.SetTokenId(context.Instance, scheduledMessage.TokenId);
        }
Exemple #8
0
        Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var requestMessage = _messageFactory(consumeContext);

            return(SendRequest(context, consumeContext, requestMessage, _serviceAddressProvider(consumeContext)));
        }
Exemple #9
0
        Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = _messageFactory(consumeContext);

            return(consumeContext.Publish(message, _publishPipe));
        }
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var requestMessage = _messageFactory?.Invoke(consumeContext) ?? await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            await SendRequest(context, consumeContext, requestMessage, _serviceAddressProvider(consumeContext)).ConfigureAwait(false);
        }
Exemple #11
0
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = _messageFactory?.Invoke(consumeContext) ?? await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            await consumeContext.Publish(message, _publishPipe).ConfigureAwait(false);
        }
 protected override Task <CookOnionRings> CreateCommand(ConsumeEventContext <FutureState, OrderOnionRings> context)
 {
     return(context.Init <CookOnionRings>(new
     {
         context.Data.OrderId,
         context.Data.OrderLineId,
         context.Data.Quantity
     }));
 }
Exemple #13
0
 /// <summary>
 /// Use when a request is received after the initial request is still awaiting completion
 /// </summary>
 /// <param name="binder"></param>
 /// <typeparam name="T"></typeparam>
 /// <returns></returns>
 public static EventActivityBinder <FutureState, T> AddSubscription <T>(this EventActivityBinder <FutureState, T> binder)
     where T : class
 {
     return(binder.Then(context =>
     {
         ConsumeEventContext <FutureState, T> consumeContext = context.CreateConsumeContext();
         context.Instance.AddSubscription(consumeContext.ResponseAddress, consumeContext.RequestId);
     }));
 }
Exemple #14
0
 protected override Task <CookFry> CreateCommand(ConsumeEventContext <FutureState, OrderFry> context)
 {
     return(context.Init <CookFry>(new
     {
         context.Data.OrderId,
         context.Data.OrderLineId,
         context.Data.Size
     }));
 }
Exemple #15
0
 private Task <IChangeOrderStatus> CreateChangeOrderStatusMessage(ConsumeEventContext <OrderState, IOrderEvent> context, OrderStatus status)
 {
     return(context.Init <IChangeOrderStatus>(new
     {
         CorrelationId = context.Instance.CorrelationId,
         OrderId = context.Instance.OrderId,
         OrderStatusId = (byte)status
     }));
 }
Exemple #16
0
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = _messageFactory(consumeContext);

            var endpoint = await consumeContext.GetSendEndpoint(_destinationAddress).ConfigureAwait(false);

            await endpoint.Send(message, _sendPipe).ConfigureAwait(false);
        }
Exemple #17
0
        async Task Activity <TInstance, TData> .Execute(BehaviorContext <TInstance, TData> context, Behavior <TInstance, TData> next)
        {
            ConsumeEventContext <TInstance, TData> consumeContext = context.CreateConsumeContext();

            var message = _messageFactory(consumeContext);

            await consumeContext.RespondAsync(message, _responsePipe).ConfigureAwait(false);

            await next.Execute(context).ConfigureAwait(false);
        }
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            ITopicProducer <TMessage> producer = context.GetProducer <TMessage>();

            await producer.Produce(message, _pipe).ConfigureAwait(false);
        }
        protected override Task <BurgerCompleted> CreateCompleted(ConsumeEventContext <FutureState, RoutingSlipCompleted> context)
        {
            var burger = context.Data.GetVariable <Burger>(nameof(BurgerCompleted.Burger));

            return(Init <RoutingSlipCompleted, BurgerCompleted>(context, new
            {
                Burger = burger,
                Description = burger.ToString()
            }));
        }
        async Task Execute(BehaviorContext <TInstance> context)
        {
            ConsumeEventContext <TInstance> consumeContext = context.CreateConsumeContext();

            var message = await _asyncMessageFactory(consumeContext).ConfigureAwait(false);

            var producer = await context.GetProducer(consumeContext, _nameProvider(consumeContext));

            await producer.Produce(message, _pipe).ConfigureAwait(false);
        }
Exemple #21
0
 protected override Task <PourShake> CreateCommand(ConsumeEventContext <FutureState, OrderShake> context)
 {
     return(context.Init <PourShake>(new
     {
         context.Data.OrderId,
         context.Data.OrderLineId,
         context.Data.Flavor,
         context.Data.Size
     }));
 }
Exemple #22
0
 protected override Task <OrderFaulted> CreateFaulted <T>(ConsumeEventContext <FutureState, T> context)
 {
     return(Init <T, OrderFaulted>(context,
                                   new
     {
         LinesCompleted = context.Instance.Results.Select(x => x.Value.ToObject <OrderLineCompleted>()).ToDictionary(x => x.OrderLineId),
         LinesFaulted = context.Instance.Faults.Select(x => x.Value.ToObject <Fault <OrderLine> >()).ToDictionary(x => x.Message.OrderLineId),
         Exceptions = context.Instance.Faults.SelectMany(x => x.Value.ToObject <Fault>().Exceptions).ToArray()
     }));
 }
Exemple #23
0
        public static EventActivityBinder <FutureState, Fault <T> > SetFault <T>(this EventActivityBinder <FutureState, Fault <T> > binder,
                                                                                 Func <ConsumeEventContext <FutureState, Fault <T> >, Guid> getResultId, AsyncEventMessageFactory <FutureState, Fault <T>, Fault <T> > messageFactory)
        {
            return(binder.ThenAsync(context =>
            {
                ConsumeEventContext <FutureState, Fault <T> > consumeContext = context.CreateConsumeContext();

                var resultId = getResultId(consumeContext);

                return context.Instance.SetFault(consumeContext, resultId, messageFactory);
            }));
        }
Exemple #24
0
        /// <summary>
        /// Set the result associated with the identifier using the message factory
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="getResultId">Should return the result identifier</param>
        /// <param name="messageFactory">Should return the result message</param>
        /// <typeparam name="T">The event type</typeparam>
        /// <typeparam name="TResult">The result type</typeparam>
        /// <returns></returns>
        public static EventActivityBinder <FutureState, T> SetResult <T, TResult>(this EventActivityBinder <FutureState, T> binder,
                                                                                  Func <ConsumeEventContext <FutureState, T>, Guid> getResultId, EventMessageFactory <FutureState, T, TResult> messageFactory)
            where T : class
            where TResult : class
        {
            return(binder.ThenAsync(context =>
            {
                ConsumeEventContext <FutureState, T> consumeContext = context.CreateConsumeContext();

                var resultId = getResultId(consumeContext);

                return context.Instance.SetResult(consumeContext, resultId, x => Task.FromResult(messageFactory(x)));
            }));
        }
        protected virtual async Task SendCommand(ConsumeEventContext <FutureState, TRequest> context, IPipe <SendContext <TCommand> > pipe)
        {
            var command = await CreateCommand(context).ConfigureAwait(false);

            if (DestinationAddress != null)
            {
                var endpoint = await context.GetSendEndpoint(DestinationAddress).ConfigureAwait(false);

                await endpoint.Send(command, pipe).ConfigureAwait(false);
            }
            else
            {
                await context.Publish(command, pipe).ConfigureAwait(false);
            }
        }
Exemple #26
0
        protected virtual Task <Fault <TRequest> > CreateFaulted(ConsumeEventContext <FutureState, RoutingSlipFaulted> context)
        {
            var message = context.Instance.GetRequest <TRequest>();

            return(context.Init <Fault <TRequest> >(new
            {
                FaultId = NewId.NextGuid(),
                FaultedMessageId = context.Data.TrackingNumber,
                FaultMessageTypes = TypeMetadataCache <TRequest> .MessageTypeNames,
                context.Host,
                context.Data.Timestamp,
                Exceptions = context.Data.ActivityExceptions.Select(x => x.ExceptionInfo).ToArray(),
                Message = message
            }));
        }
        protected virtual Task <Fault <TRequest> > CreateFaulted(ConsumeEventContext <FutureState, Fault <TCommand> > context)
        {
            var message = context.Instance.GetRequest <TRequest>();

            return(context.Init <Fault <TRequest> >(new
            {
                context.Data.FaultId,
                context.Data.FaultedMessageId,
                context.Data.Timestamp,
                context.Data.Exceptions,
                context.Data.Host,
                context.Data.FaultMessageTypes,
                Message = message
            }));
        }
Exemple #28
0
        protected override Task <Fault <OrderFryShake> > CreateFaulted <T>(ConsumeEventContext <FutureState, T> context)
        {
            var message = context.Instance.GetRequest <OrderFryShake>();
            Fault <OrderLine> faulted = context.Instance.Faults.Select(x => x.Value.ToObject <Fault <OrderLine> >()).First();

            return(context.Init <Fault <OrderFryShake> >(new
            {
                faulted.FaultId,
                faulted.FaultedMessageId,
                Timestamp = context.Instance.Faulted,
                faulted.Exceptions,
                faulted.Host,
                faulted.FaultMessageTypes,
                Message = message
            }));
        }
        public async Task Execute(BehaviorContext <TInstance, TData> context, Behavior <TInstance, TData> next)
        {
            ConsumeEventContext <TInstance, TData> consumeContext = context.CreateConsumeContext();

            InitializeContext <RequestCompleted <TData> > initializeContext = await MessageInitializerCache <RequestCompleted <TData> > .Initialize(new
            {
                context.Instance.CorrelationId,
                InVar.Timestamp,
                PayloadType = TypeMetadataCache <TData> .MessageTypeNames,
                Payload     = context.Data
            }).ConfigureAwait(false);

            object message = initializeContext.Message;

            await consumeContext.Publish(message, typeof(RequestCompleted)).ConfigureAwait(false);

            await next.Execute(context).ConfigureAwait(false);
        }
        public async Task Execute(BehaviorContext <FutureState, T> context, Behavior <FutureState, T> next)
        {
            ConsumeEventContext <FutureState, T> consumeContext = context.CreateConsumeContext();

            // this will need to be done by a consumer at some point, to handle retry/fault handling

            var trackingNumber = context.Instance.CorrelationId;

            var builder = new RoutingSlipBuilder(trackingNumber);

            builder.AddSubscription(consumeContext.ReceiveContext.InputAddress, RoutingSlipEvents.Completed | RoutingSlipEvents.Faulted);

            await _planner.PlanItinerary(consumeContext.Data, builder).ConfigureAwait(false);

            var routingSlip = builder.Build();

            await consumeContext.Execute(routingSlip).ConfigureAwait(false);
        }