static ActiveSagaInstance AssociateSagaWithMessage(FakeSaga saga, IInvokeHandlerContext behaviorContext)
        {
            var sagaInstance = new ActiveSagaInstance(saga, SagaMetadata.Create(typeof(FakeSaga), new List <Type>(), new Conventions()), () => DateTime.UtcNow);

            behaviorContext.Extensions.Set(sagaInstance);
            return(sagaInstance);
        }
Exemple #2
0
        public static Task HandleCurrentMessageLater(IInvokeHandlerContext context)
        {
            if (context.HandleCurrentMessageLaterWasCalled)
            {
                return(TaskEx.CompletedTask);
            }

            var messageBeingProcessed = context.Extensions.Get <IncomingMessage>();
            var settings = context.Builder.Build <ReadOnlySettings>();

            if (settings.IsFeatureActive(typeof(Features.Outbox)))
            {
                // as HandleCurrentMessageLater reuses the incoming message's message id, this will cause the message to be deduplicated by the outbox causing a message loss.
                throw new InvalidOperationException("HandleCurrentMessageLater cannot be used in conjunction with the Outbox. Use the recoverability mechanisms or delayed delivery instead.");
            }

            var cache    = context.Extensions.Get <IPipelineCache>();
            var pipeline = cache.Pipeline <IRoutingContext>();

            var outgoingMessage = new OutgoingMessage(
                messageBeingProcessed.MessageId,
                messageBeingProcessed.Headers,
                messageBeingProcessed.Body);

            var routingContext = new RoutingContext(outgoingMessage, new UnicastRoutingStrategy(settings.LocalAddress()), context);

            return(pipeline.Invoke(routingContext));
        }
 public static bool IsTimeoutMessage(this IInvokeHandlerContext message)
 {
     if (message.Headers.TryGetValue(Headers.IsSagaTimeoutMessage, out var isTimeoutString))
     {
         return(string.Equals(isTimeoutString, "true", StringComparison.OrdinalIgnoreCase));
     }
     return(false);
 }
    public static string OriginatingMachine(this IInvokeHandlerContext context)
    {
        if (context.Headers.TryGetValue(Headers.OriginatingMachine, out var intent))
        {
            return(intent);
        }

        return(string.Empty);
    }
Exemple #5
0
    public static string OriginatingEndpoint(this IInvokeHandlerContext context)
    {
        if (context.Headers.TryGetValue(Headers.OriginatingEndpoint, out var endpoint))
        {
            return(endpoint);
        }

        return(string.Empty);
    }
    public static string MessageIntent(this IInvokeHandlerContext logicalMessage)
    {
        var headers = logicalMessage.Headers;

        if (headers.TryGetValue(Headers.MessageIntent, out var intent))
        {
            return(intent);
        }
        return("Send");
    }
Exemple #7
0
        public static bool IsTimeoutMessage(this IInvokeHandlerContext message)
        {
            string isTimeoutString;

            if (message.Headers.TryGetValue(Headers.IsSagaTimeoutMessage, out isTimeoutString))
            {
                return(isTimeoutString == "true");
            }
            return(false);
        }
        private static string GetCheckMessageOrderType(IInvokeHandlerContext context)
        {
            context.MessageHeaders.TryGetValue("CheckMessageOrderType", out string checkMessageOrderType);
            if (!string.IsNullOrEmpty(checkMessageOrderType))
            {
                return(checkMessageOrderType);
            }

            var messageType       = context.MessageMetadata.MessageType;
            var checkMessageOrder = ChecksMessageOrderBy(messageType, typeof(ICheckMessageOrder <>));

            return(checkMessageOrder == null ? messageType.FullName : checkMessageOrder.GetGenericArguments()[0].FullName);
        }
        public override async Task Invoke(IInvokeHandlerContext context, Func <Task> next)
        {
            var session = context.SynchronizedStorageSession;
            var sqlPersistenceSession = session.SqlPersistenceSession();
            var dbContext             = (TDataContext)Activator.CreateInstance(typeof(TDataContext), sqlPersistenceSession.Connection);

            await using (dbContext)
            {
                dbContext.Database.UseTransaction(sqlPersistenceSession.Transaction);

                context.Extensions.Set(dbContext);

                await next();

                await dbContext.SaveChangesAsync();
            }
        }
        public override async Task Invoke(IInvokeHandlerContext context, Func <Task> next)
        {
            var session = context.SynchronizedStorageSession;
            var sqlPersistenceSession = session.SqlPersistenceSession();
            var dbContext             = (InboxDbContext)Activator.CreateInstance(typeof(InboxDbContext), sqlPersistenceSession.Connection);

            using (dbContext)
            {
                dbContext.Database.UseTransaction(sqlPersistenceSession.Transaction);

                context.MessageHeaders.TryGetValue("ContentId", out string contentId);
                long contentVersion = GetContentVersionFrom(context.MessageHeaders);

                var checkMessageOrderType = GetCheckMessageOrderType(context);

                var latestHandledVersion = await dbContext.GetLatestMessageVersion(contentId, checkMessageOrderType).ConfigureAwait(false);

                var shouldBeHandled = latestHandledVersion == null || contentVersion > latestHandledVersion;

                var inboxMessage = new InboxRecord
                {
                    ContentId             = contentId,
                    ContentVersion        = contentVersion,
                    CheckMessageOrderType = checkMessageOrderType,
                    MessageId             = Guid.Parse(context.MessageId),
                    ModifiedAtUtc         = DateTime.UtcNow
                };

                if (shouldBeHandled)
                {
                    log.Info($"Handling message: Type: {checkMessageOrderType}, ContentId: {contentId}, ContentVersion: {contentVersion}");
                    await dbContext.PersistHandledMessage(inboxMessage).ConfigureAwait(false);
                    await next().ConfigureAwait(false);
                }
                else
                {
                    string discardedReason = $"Discarding message since a newer version has already been processed: Type: {checkMessageOrderType}, ContentId: {contentId}, ContentVersion: {contentVersion}";
                    log.Info(discardedReason);
                    await dbContext.PersistDiscardedMessage(inboxMessage, latestHandledVersion.GetValueOrDefault()).ConfigureAwait(false);

                    context.Headers.Add("InboxDiscardedReason", discardedReason);
                }
            }
        }
        public override async Task Invoke(IInvokeHandlerContext context, Func <Task> next)
        {
            var session = context.SynchronizedStorageSession;
            var sqlPersistenceSession = session.SqlPersistenceSession();
            var dbContext             = (TDbContext)Activator.CreateInstance(typeof(TDbContext), sqlPersistenceSession.Connection);

            using (dbContext)
            {
                dbContext.Database.UseTransaction(sqlPersistenceSession.Transaction);
                context.Extensions.Set(dbContext);

                await next()
                .ConfigureAwait(false);

                await dbContext.SaveChangesAsync().ConfigureAwait(false);

                //Here I also want to find all effected dbcontext modified entities and in them there aggregateroots
                //and then publish the uncommitedevents that they have. I have removed this from this sample cause I do not
                //think it is important to why it is not able to save without throwing exceptions and loosing data.
            }
        }
        public static Task HandleCurrentMessageLater(IInvokeHandlerContext context)
        {
            if (context.HandleCurrentMessageLaterWasCalled)
            {
                return TaskEx.CompletedTask;
            }

            var messageBeingProcessed = context.Extensions.Get<IncomingMessage>();
            var settings = context.Builder.Build<ReadOnlySettings>();

            var cache = context.Extensions.Get<IPipelineCache>();
            var pipeline = cache.Pipeline<IRoutingContext>();

            var outgoingMessage = new OutgoingMessage(
                messageBeingProcessed.MessageId,
                messageBeingProcessed.Headers,
                messageBeingProcessed.Body);

            var routingContext = new RoutingContext(outgoingMessage, new UnicastRoutingStrategy(settings.LocalAddress()), context);

            return pipeline.Invoke(routingContext);
        }
        public static Task HandleCurrentMessageLater(IInvokeHandlerContext context)
        {
            if (context.HandleCurrentMessageLaterWasCalled)
            {
                return(TaskEx.CompletedTask);
            }

            var messageBeingProcessed = context.Extensions.Get <IncomingMessage>();
            var settings = context.Builder.Build <ReadOnlySettings>();

            var cache    = context.Extensions.Get <IPipelineCache>();
            var pipeline = cache.Pipeline <IRoutingContext>();

            var outgoingMessage = new OutgoingMessage(
                messageBeingProcessed.MessageId,
                messageBeingProcessed.Headers,
                messageBeingProcessed.Body);

            var routingContext = new RoutingContext(outgoingMessage, new UnicastRoutingStrategy(settings.LocalAddress()), context);

            return(pipeline.Invoke(routingContext));
        }
 public Task Validate(IInvokeHandlerContext handlerContext)
 {
     return(Validate(handlerContext.MessageBeingHandled.GetType(), handlerContext.Builder, handlerContext.MessageBeingHandled, handlerContext.Headers, handlerContext.Extensions));
 }
Exemple #15
0
 public static DateTime TimeSent(this IInvokeHandlerContext logicalMessage)
 {
     return(DateTimeExtensions.ToUtcDateTime(logicalMessage.Headers[Headers.TimeSent]));
 }
 public static DateTime TimeSent(this IInvokeHandlerContext context)
 {
     return(DateTimeExtensions.ToUtcDateTime(context.Headers[Headers.TimeSent]));
 }
 public static string MessageName(this IInvokeHandlerContext context)
 {
     return(context.MessageMetadata.MessageType.FullName);
 }
 public static string HandlerName(this IInvokeHandlerContext context)
 {
     return(context.MessageHandler.HandlerType.FullName);
 }
 public static string MessageIntent(this IInvokeHandlerContext context)
 {
     return(MessageIntent(context.Headers));
 }
 public static ActiveSagaInstance GetSagaInstance(this IInvokeHandlerContext context)
 {
     return(context.Extensions.TryGet(out ActiveSagaInstance saga) ? saga : null);
 }
 public static string MessageIntent(this IInvokeHandlerContext context) =>
 MessageIntent(context.Headers);
 public static string HandlerType(this IInvokeHandlerContext context) =>
 context.MessageHandler.HandlerType.FullName !;
 public static Type MessageType(this IInvokeHandlerContext context) =>
 context.MessageMetadata.MessageType;
Exemple #24
0
 public static Type MessageType(this IInvokeHandlerContext context)
 {
     return(context.MessageMetadata.MessageType);
 }