Example #1
0
        public void DbContextPoolTest()
        {
            int hashCode1, hashCode2;
            var services = new ServiceCollection();

            services.AddScoped <DbTest>();
            using (var scope = ObjectProviderFactory.CreateScope(provider => provider.RegisterInstance(new DbTest(3))))
            {
                var dbContext = scope.GetService <DemoDbContext>();
                hashCode1 = dbContext.GetHashCode();
                dbContext.Database.AutoTransactionsEnabled = false;
                var dbTest = scope.GetService <DbTest>();
                Assert.Equal(3, dbTest.Count);
            }

            using (var scope = ObjectProviderFactory.CreateScope(provider => provider.RegisterInstance(new DbTest(1))))
            {
                var dbContext = scope.GetService <DemoDbContext>();
                hashCode2 = dbContext.GetHashCode();
                Assert.True(dbContext.Database.AutoTransactionsEnabled);
                var dbTest = scope.GetService <DbTest>();
                Assert.Equal(1, dbTest.Count);
            }

            Assert.Equal(hashCode1, hashCode2);
        }
Example #2
0
        public async Task GetUsersTest()
        {
            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var serviceProvider = scope.GetService <IServiceProvider>();
                if (serviceProvider == null)
                {
                    var logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());
                    logger.LogError((scope as ObjectProvider)?.UnityContainer.Registrations.ToJson());
                    Assert.NotNull(serviceProvider);
                }
                var dbContext = scope.GetService <DemoDbContext>();
                var users     = await dbContext.Users
                                //.Include(u => u.Cards)
                                .FindAll(u => !string.IsNullOrWhiteSpace(u.Name))
                                .Take(10)
                                .ToArrayAsync();

                foreach (var u in users)
                {
                    await u.LoadCollectionAsync(u1 => u1.Cards);

                    Assert.Equal(u.GetDbContext <DemoDbContext>().GetHashCode(), dbContext.GetHashCode());
                }
            }
        }
Example #3
0
        public async Task AddPresonTest()
        {
            try
            {
                var id = DateTime.Now.Ticks;
                using (var serviceScope = ObjectProviderFactory.CreateScope())
                {
                    var dbContext = serviceScope.GetService <DemoDbContext>();
                    var person    = new Person(id, "ivan");
                    dbContext.Persons.Add(person);
                    await dbContext.SaveChangesAsync();
                }

                using (var serviceScope = ObjectProviderFactory.CreateScope())
                {
                    var dbContext = serviceScope.GetService <DemoDbContext>();
                    var person    = await dbContext.Persons.FindAsync(id).ConfigureAwait(false);

                    Assert.NotNull(person);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
        public void TestLog()
        {
            var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json");

            Configuration.Instance
            .UseAutofacContainer(new ContainerBuilder())
            .UseConfiguration(builder.Build())
            .UseJsonNet()
            .UseLog4Net();

            ObjectProviderFactory.Instance.Build();

            var loggerFactory = ObjectProviderFactory.GetService <ILoggerFactory>();
            var logger        = loggerFactory.CreateLogger(GetType());


            try
            {
                throw new NotImplementedException("test exception");
            }
            catch (Exception e)
            {
                LogTest(logger, e);
            }
        }
Example #5
0
 protected MessageSender(IMessageQueueClient messageQueueClient, string defaultTopic = null)
 {
     MessageQueueClient = messageQueueClient;
     DefaultTopic       = defaultTopic;
     MessageStateQueue  = new BlockingCollection <MessageState>();
     Logger             = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());
 }
Example #6
0
        public EventSubscriber(IMessageQueueClient messageQueueClient,
                               IHandlerProvider handlerProvider,
                               ICommandBus commandBus,
                               IMessagePublisher messagePublisher,
                               string subscriptionName,
                               TopicSubscription[] topicSubscriptions,
                               string consumerId,
                               ConsumerConfig consumerConfig = null)
        {
            ConsumerConfig      = consumerConfig ?? ConsumerConfig.DefaultConfig;
            MessageQueueClient  = messageQueueClient;
            HandlerProvider     = handlerProvider;
            _topicSubscriptions = topicSubscriptions ?? new TopicSubscription[0];
            _topicSubscriptions.Where(ts => ts.TagFilter != null)
            .ForEach(ts => { TagFilters.Add(ts.Topic, ts.TagFilter); });
            ConsumerId       = consumerId;
            SubscriptionName = subscriptionName;
            MessagePublisher = messagePublisher;
            CommandBus       = commandBus;
            var loggerFactory = ObjectProviderFactory.GetService <ILoggerFactory>();

            MessageProcessor = new MailboxProcessor(new DefaultProcessingMessageScheduler(),
                                                    new OptionsWrapper <MailboxOption>(new MailboxOption
            {
                BatchCount = ConsumerConfig.MailboxProcessBatchCount
            }),
                                                    loggerFactory.CreateLogger <MailboxProcessor>());
            Logger = loggerFactory.CreateLogger(GetType().Name);
        }
Example #7
0
        public EntityFrameworkTests()
        {
            var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json");

            Configuration.Instance
            //.UseMicrosoftDependencyInjection()
            //.UseUnityContainer()
            .UseAutofacContainer()
            .UseConfiguration(builder.Build())
            .UseCommonComponents()
            .UseJsonNet()
            .UseLog4Net()
            .UseDbContextPool <DemoDbContext>(options =>
            {
                options.EnableSensitiveDataLogging();
                options.UseMySQL(Configuration.Instance.GetConnectionString(DemoDbContextFactory.MySqlConnectionStringName));
                //options.UseInMemoryDatabase(nameof(DemoDbContext));
                //options.UseSqlServer(Configuration.Instance.GetConnectionString(DemoDbContextFactory.ConnectionStringName));
            }, 1000);

            ObjectProviderFactory.Instance.Build();
            using (var serviceScope = ObjectProviderFactory.CreateScope())
            {
                var dbContext = serviceScope.GetService <DemoDbContext>();
                dbContext.Database.Migrate();
            }
        }
Example #8
0
 static MessageSender()
 {
     NeedMessageStore = Configuration.Instance.NeedMessageStore;
     if (NeedMessageStore)
     {
         ObjectProviderFactory.GetService <IMessageStoreDaemon>().Start();
     }
 }
Example #9
0
 public async Task Test1()
 {
     using (var scope = ObjectProviderFactory.CreateScope())
     {
         var service = scope.GetService <IAliPayBankCardParseService>();
         var result  = await service.ParseBankCardAsync(cardNo : "6217920159440572");
     }
 }
Example #10
0
 public MessageQueueClient(IMessageQueueClientProvider clientProvider)
 {
     _clientProvider = clientProvider;
     QueueClients    = new ConcurrentDictionary <string, IMessageProducer>();
     TopicClients    = new ConcurrentDictionary <string, IMessageProducer>();
     Subscribers     = new List <IMessageConsumer>();
     QueueConsumers  = new List <IMessageConsumer>();
     Logger          = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType().Name);
 }
Example #11
0
        public async Task CrudTest()
        {
            User user = null;

            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var dbCtx = scope.GetRequiredService <DemoDbContext>();

                var unitOfWork = scope.GetRequiredService <IUnitOfWork>();
                var repository = scope.GetRequiredService <IDemoRepository>();
                user = new User($"ivan-{DateTime.Now.Ticks}", "male");
                repository.Add(user);
                await unitOfWork.CommitAsync()
                .ConfigureAwait(false);
            }
            var newName = $"new name {DateTime.Now.Ticks}";

            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var repository = scope.GetRequiredService <IDemoRepository>();
                var unitOfWork = scope.GetRequiredService <IUnitOfWork>();
                user = await repository.GetByKeyAsync <User>(user.Id)
                       .ConfigureAwait(false);

                Assert.NotNull(user);
                user.ModifyName(newName);
                var dbCtx = scope.GetRequiredService <DemoDbContext>();

                await unitOfWork.CommitAsync()
                .ConfigureAwait(false);
            }

            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var repository = scope.GetRequiredService <IDemoRepository>();
                var unitOfWork = scope.GetRequiredService <IUnitOfWork>();
                user = await repository.GetByKeyAsync <User>(user.Id)
                       .ConfigureAwait(false);

                Assert.True(user.Name == newName);
                repository.Remove(user);
                await unitOfWork.CommitAsync()
                .ConfigureAwait(false);
            }

            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var repository = scope.GetRequiredService <IDemoRepository>();
                user = await repository.GetByKeyAsync <User>(user.Id)
                       .ConfigureAwait(false);

                Assert.Null(user);
            }
        }
Example #12
0
        public object GetHandler(Type messageType)
        {
            object handler     = null;
            var    handlerType = GetHandlerType(messageType);

            if (handlerType != null)
            {
                handler = ObjectProviderFactory.GetService(handlerType.Type);
            }
            return(handler);
        }
Example #13
0
 protected MessageConsumer(string[] topics,
                           string groupId,
                           string consumerId,
                           ConsumerConfig consumerConfig = null)
 {
     Logger         = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());
     ConsumerConfig = consumerConfig ?? ConsumerConfig.DefaultConfig;
     Topics         = topics;
     GroupId        = groupId;
     ConsumerId     = consumerId ?? string.Empty;
     SlidingDoors   = new ConcurrentDictionary <string, SlidingDoor>();
 }
Example #14
0
        public static Configuration UseMessagePublisher(this Configuration configuration, string defaultTopic)
        {
            var builder = ObjectProviderFactory.Instance.ObjectProviderBuilder;

            builder.Register <IMessagePublisher>(provider =>
            {
                var messageQueueClient = ObjectProviderFactory.GetService <IMessageQueueClient>();
                configuration.SetDefaultTopic(defaultTopic);
                defaultTopic         = configuration.FormatAppName(defaultTopic);
                var messagePublisher = new MessagePublisher(messageQueueClient, defaultTopic);
                return(messagePublisher);
            }, ServiceLifetime.Singleton);
            return(configuration);
        }
Example #15
0
 public SlidingDoor(Action <MessageOffset> commitOffset,
                    string topic,
                    int partition,
                    bool commitPerMessage = false)
 {
     CommitOffset          = commitOffset;
     Topic                 = topic;
     Partition             = partition;
     Offsets               = new SortedSet <long>();
     RemovedMessageOffsets = new SortedList <long, MessageOffset>();
     CommitPerMessage      = commitPerMessage;
     _logger               = ObjectProviderFactory.GetService <ILoggerFactory>()
                             .CreateLogger(GetType());
 }
Example #16
0
        public async Task InnerJoinTest()
        {
            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var repository = scope.GetRequiredService <IDemoRepository>();
                var query      = from user in repository.FindAll <User>()
                                 join card in repository.FindAll <Card>()
                                 on user.Id equals card.Id
                                 select new { user.Id, card.Name };

                var sql    = query.ToString();
                var result = await query.ToListAsync();
            }
        }
Example #17
0
        public static void Bootstrap()
        {
            try
            {
                var kafkaBrokerList = new[]
                {
                    new IPEndPoint(Utility.GetLocalIpv4(), 9092).ToString()
                    //"10.100.7.46:9092"
                };
                Configuration.Instance
                .UseAutofacContainer(Assembly.GetExecutingAssembly().FullName,
                                     "Sample.CommandHandler",
                                     "Sample.DomainEventSubscriber",
                                     "Sample.AsyncDomainEventSubscriber",
                                     "Sample.ApplicationEventSubscriber")
                .UseConfiguration(new ConfigurationBuilder().AddJsonFile("appsettings.json")
                                  .Build())
                .UseCommonComponents()
                .UseJsonNet()
                .UseLog4Net()
                .UseEntityFrameworkComponents <SampleModelContext>()
                .UseMessageStore <SampleModelContext>()
                .UseInMemoryMessageQueue()
                //.UseConfluentKafka(string.Join(",", kafkaBrokerList))
                //.UseEQueue()
                .UseCommandBus(Environment.MachineName, linerCommandManager: new LinearCommandManager())
                .UseMessagePublisher("eventTopic")
                .UseDbContextPool <SampleModelContext>(options => options.UseInMemoryDatabase(nameof(SampleModelContext)))
                //.UseDbContextPool<SampleModelContext>(options => options.UseSqlServer(Configuration.GetConnectionString(nameof(SampleModelContext))))
                ;

                ObjectProviderFactory.Instance
                .RegisterComponents(RegisterComponents, ServiceLifetime.Scoped)
                .Build();

                StartMessageQueueComponents();
                _Logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(typeof(WebApiApplication).Name);


                _Logger.LogDebug($"App Started");
            }
            catch (Exception ex)
            {
                _Logger.LogError(ex.GetBaseException().Message, ex);
            }
        }
Example #18
0
        public async Task AddUserTest()
        {
            using (var serviceScope = ObjectProviderFactory.CreateScope())
                using (var scope = new TransactionScope(TransactionScopeOption.Required,
                                                        new TransactionOptions {
                    IsolationLevel = IsolationLevel.ReadCommitted
                },
                                                        TransactionScopeAsyncFlowOption.Enabled))
                {
                    var serviceProvider = serviceScope.GetService <IServiceProvider>();
                    if (serviceProvider == null)
                    {
                        Assert.NotNull(serviceProvider);
                    }

                    try
                    {
                        var dbContext = serviceScope.GetService <DemoDbContext>();
                        if (dbContext == null)
                        {
                            var logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());
                            logger.LogError((serviceScope as ObjectProvider)?.UnityContainer.Registrations.ToJson());
                            Assert.NotNull(dbContext);
                        }

                        var user = new User("ivan", "male");
                        user.AddCard("ICBC");
                        user.AddCard("CCB");
                        user.AddCard("ABC");

                        dbContext.Users.Add(user);
                        await dbContext.SaveChangesAsync();

                        scope.Complete();
                        var client   = dbContext.GetMongoDbClient();
                        var database = dbContext.GetMongoDbDatabase();
                        var conn     = dbContext.GetMongoDbConnection();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        throw;
                    }
                }
        }
Example #19
0
        public static IMessageProcessor CreateCommandConsumer(string commandQueue,
                                                              string consumerId,
                                                              string[] handlerProvierNames,
                                                              ConsumerConfig consumerConfig = null)
        {
            var container          = ObjectProviderFactory.Instance.ObjectProvider;
            var messagePublisher   = container.GetService <IMessagePublisher>();
            var handlerProvider    = new CommandHandlerProvider(handlerProvierNames);
            var messageQueueClient = ObjectProviderFactory.GetService <IMessageQueueClient>();
            var commandConsumer    = new CommandProcessor(messageQueueClient,
                                                          messagePublisher,
                                                          handlerProvider,
                                                          commandQueue,
                                                          consumerId,
                                                          consumerConfig);

            return(commandConsumer);
        }
Example #20
0
 public async Task AddPresonTest()
 {
     try
     {
         using (var serviceScope = ObjectProviderFactory.CreateScope())
         {
             var dbContext = serviceScope.GetService <DemoDbContext>();
             var person    = new Person("ivan");
             dbContext.Persons.Add(person);
             await dbContext.SaveChangesAsync();
         }
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
Example #21
0
        public async Task GetUsersTest()
        {
            using (var scope = ObjectProviderFactory.CreateScope())
            {
                var serviceProvider = scope.GetService <IServiceProvider>();
                if (serviceProvider == null)
                {
                    var logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());
                    logger.LogError((scope as ObjectProvider)?.UnityContainer.Registrations.ToJson());
                    Assert.NotNull(serviceProvider);
                }

                //var options = new DbContextOptionsBuilder<DemoDbContext>();
                //options.UseMongoDb(Configuration.Instance.GetConnectionString(DemoDbContextFactory.MongoDbConnectionStringName));

                var dbContext = scope.GetService <DemoDbContext>();

                try
                {
                    var user = await dbContext.Users.FindAsync("5BEE29960CCE411C20215A17").ConfigureAwait(false);

                    // var connection = dbContext.GetMongoDbDatabase();
                    var users = await dbContext.Users
                                //.Include(u => u.Cards)
                                //.FindAll(u => !string.IsNullOrWhiteSpace(u.Name))
                                .Take(10)
                                .ToListAsync()
                                .ConfigureAwait(false);

                    //foreach (var u in users)
                    //{
                    //    await u.LoadCollectionAsync(u1 => u1.Cards);
                    //    Assert.True(u.Cards.Count > 0);
                    //    //Assert.Equal(u.GetDbContext<DemoDbContext>().GetHashCode(), dbContext.GetHashCode());
                    //}
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
            }
        }
Example #22
0
 public CommandBus(IMessageQueueClient messageQueueClient,
                   ILinearCommandManager linearCommandManager,
                   string consumerId,
                   string replyTopicName,
                   string replySubscriptionName,
                   ConsumerConfig consumerConfig = null)
     : base(messageQueueClient)
 {
     _consumerConfig        = consumerConfig ?? ConsumerConfig.DefaultConfig;
     _consumerId            = consumerId;
     _commandStateQueues    = new ConcurrentDictionary <string, MessageState>();
     _linearCommandManager  = linearCommandManager;
     _replyTopicName        = Configuration.Instance.FormatAppName(replyTopicName);
     _replySubscriptionName = Configuration.Instance.FormatAppName(replySubscriptionName);
     // _commandQueueNames = commandQueueNames;
     _messageProcessor = new MailboxProcessor(new DefaultProcessingMessageScheduler(),
                                              new OptionsWrapper <MailboxOption>(new MailboxOption
     {
         BatchCount = _consumerConfig.MailboxProcessBatchCount
     }),
                                              ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger <MailboxProcessor>());
 }
Example #23
0
        public CommandBusTests()
        {
            _logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(typeof(CommandBusTests));

            _commandBus = ObjectProviderFactory.GetService <ICommandBus>();

            _createProducts = new List <CreateProduct>();
            var tasks = new List <Task>();

            for (var i = 0; i < productCount; i++)
            {
                var createProduct = new CreateProduct
                {
                    ProductId = Guid.NewGuid(),
                    Name      = string.Format("{0}-{1}", DateTime.Now, i),
                    Count     = 20000
                };
                _createProducts.Add(createProduct);
                tasks.Add(_commandBus.SendAsync(createProduct, true).Result.Reply);
            }
            Task.WaitAll(tasks.ToArray());
        }
Example #24
0
        public void Process(string fileName, InputConfiguration configuration)
        {
            var files        = this.GetFileNames(fileName, configuration);
            var objectTuples = new List <Tuple <ObjectBase, ObjectDefinitionBase> >();

            foreach (var file in files)
            {
                var objectContainers = JsonConvert.DeserializeObject <List <ObjectContainer> >(File.ReadAllText(file));

                foreach (var objectContainer in objectContainers)
                {
                    var objectDefinition = ObjectProviderFactory.GetProvider(this.ServiceProvider, objectContainer.Object).Create(objectContainer.Object);
                    this.Definitions.Add(objectDefinition);
                    objectTuples.Add(new Tuple <ObjectBase, ObjectDefinitionBase>(objectContainer.Object, objectDefinition));
                }
            }

            foreach (var objectTuple in objectTuples)
            {
                ObjectProviderFactory.GetProvider(this.ServiceProvider, objectTuple.Item1).Process(objectTuple.Item2, objectTuple.Item1, this);
            }
        }
Example #25
0
        public async Task DbContextPoolScopeTest()
        {
            var tasks = new object[10].Select(o => Task.Run(() =>
            {
                using (var scope = ObjectProviderFactory.CreateScope())
                {
                    var dbCtx    = scope.GetService <DemoDbContext>();
                    var hashCode = dbCtx.GetHashCode();

                    dbCtx = scope.GetService <DemoDbContext>();
                    Assert.Equal(hashCode, dbCtx.GetHashCode());

                    dbCtx = scope.GetService <DemoDbContext>();
                    Assert.Equal(hashCode, dbCtx.GetHashCode());

                    _output.WriteLine($"dbctx hashcode  {hashCode}");
                }
            })).ToArray();
            await Task.WhenAll(tasks);

            tasks = new object[10].Select(o => Task.Run(() =>
            {
                using (var scope = ObjectProviderFactory.CreateScope())
                {
                    var dbCtx    = scope.GetService <DemoDbContext>();
                    var hashCode = dbCtx.GetHashCode();

                    dbCtx = scope.GetService <DemoDbContext>();
                    Assert.Equal(hashCode, dbCtx.GetHashCode());

                    dbCtx = scope.GetService <DemoDbContext>();
                    Assert.Equal(hashCode, dbCtx.GetHashCode());

                    _output.WriteLine($"dbctx hashcode  {hashCode}");
                }
            })).ToArray();
            await Task.WhenAll(tasks);
        }
Example #26
0
        public static IMessageProcessor CreateEventSubscriber(TopicSubscription[] topicSubscriptions,
                                                              string subscription,
                                                              string consumerId,
                                                              string[] handlerProviderNames,
                                                              ConsumerConfig consumerConfig = null)
        {
            subscription = Configuration.Instance.FormatAppName(subscription);
            var handlerProvider    = new EventSubscriberProvider(handlerProviderNames);
            var commandBus         = GetCommandBus();
            var messagePublisher   = GetMessagePublisher();
            var messageQueueClient = ObjectProviderFactory.GetService <IMessageQueueClient>();

            var eventSubscriber = new EventSubscriber(messageQueueClient,
                                                      handlerProvider,
                                                      commandBus,
                                                      messagePublisher,
                                                      subscription,
                                                      topicSubscriptions,
                                                      consumerId,
                                                      consumerConfig);

            return(eventSubscriber);
        }
Example #27
0
        public async Task ConcurrentTest()
        {
            var logger = ObjectProviderFactory.GetService <ILoggerFactory>().CreateLogger(GetType());

            try
            {
                //await AddUserTest();
                var tasks = new List <Task>();
                for (int i = 0; i < 5; i++)
                {
                    tasks.Add(GetUsersTest());
                }

                await Task.WhenAll(tasks);

                logger.LogDebug($"incremented : {DemoDbContext.Total}");
            }
            catch (Exception e)
            {
                logger.LogError(e, $"incremented : {DemoDbContext.Total}");
                throw;
            }
        }
Example #28
0
        public CommandProcessor(IMessageQueueClient messageQueueClient,
                                IMessagePublisher messagePublisher,
                                IHandlerProvider handlerProvider,
                                string commandQueueName,
                                string consumerId,
                                ConsumerConfig consumerConfig = null)
        {
            ConsumerConfig          = consumerConfig ?? ConsumerConfig.DefaultConfig;
            CommandQueueName        = commandQueueName;
            HandlerProvider         = handlerProvider;
            MessagePublisher        = messagePublisher;
            ConsumerId              = consumerId;
            CancellationTokenSource = new CancellationTokenSource();
            MessageQueueClient      = messageQueueClient;
            var loggerFactory = ObjectProviderFactory.GetService <ILoggerFactory>();

            MessageProcessor = new MailboxProcessor(new DefaultProcessingMessageScheduler(),
                                                    new OptionsWrapper <MailboxOption>(new MailboxOption
            {
                BatchCount = ConsumerConfig.MailboxProcessBatchCount
            }),
                                                    loggerFactory.CreateLogger <MailboxProcessor>());
            Logger = loggerFactory.CreateLogger(GetType().Name);
        }
Example #29
0
        public async Task ConcurrentUdpateTest()
        {
            using (var serviceScope = ObjectProviderFactory.CreateScope())
            {
                var concurrencyProcessor = serviceScope.GetService <IConcurrencyProcessor>();
                var dbContext            = serviceScope.GetService <DemoDbContext>();
                using (var transactionScope = new TransactionScope(TransactionScopeOption.Required,
                                                                   new TransactionOptions
                {
                    IsolationLevel = IsolationLevel.ReadCommitted
                },
                                                                   TransactionScopeAsyncFlowOption.Enabled))
                {
                    await concurrencyProcessor.ProcessAsync(async() =>
                    {
                        var account = await dbContext.Users.FirstOrDefaultAsync();
                        account.ModifyName($"ivan{DateTime.Now}");
                        await dbContext.SaveChangesAsync();
                    });

                    transactionScope.Complete();
                }
            }
        }
Example #30
0
        private void RemoveMessages(CancellationTokenSource cancellationTokenSource)
        {
            while (!cancellationTokenSource.IsCancellationRequested)
            {
                try
                {
                    var             toRemoveMessages = new List <ToRemoveMessage>();
                    ToRemoveMessage toRemoveMessage  = null;
                    do
                    {
                        _toRemoveMessages.TryDequeue(out toRemoveMessage);
                        if (toRemoveMessage != null)
                        {
                            toRemoveMessages.Add(toRemoveMessage);
                        }
                    } while (toRemoveMessages.Count < 10 && toRemoveMessage != null);

                    if (toRemoveMessages.Count == 0)
                    {
                        Task.Delay(1000).Wait();
                    }
                    else
                    {
                        using (var scope = ObjectProviderFactory.CreateScope())
                        {
                            var messageStore = scope.GetService <IMessageStore>() as MessageStore;
                            if (messageStore == null)
                            {
                                throw new Exception("invalid messagestore!");
                            }


                            var toRemoveCommands = toRemoveMessages.Where(rm => rm.Type == MessageType.Command)
                                                   .Select(rm => rm.MessageId)
                                                   .ToArray();
                            if (toRemoveCommands.Length > 0)
                            {
                                RemoveUnSentCommands(messageStore, toRemoveCommands);
                            }

                            var toRemoveEvents = toRemoveMessages.Where(rm => rm.Type == MessageType.Event)
                                                 .Select(rm => rm.MessageId)
                                                 .ToArray();
                            if (toRemoveEvents.Length > 0)
                            {
                                RemoveUnPublishedEvents(messageStore, toRemoveEvents);
                            }

                            messageStore.SaveChanges();
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"remove Messages Processing faield!");
                }
            }
        }