コード例 #1
0
        public async Task TestMySqlSagaLocks()
        {
            var loggerFactory = new ListLoggerFactory(outputToConsole: true);
            var network       = new InMemNetwork();

            var handlerActivator = Using(new BuiltinHandlerActivator());

            handlerActivator.Handle <ProcessThisThingRequest>((bus, request) => bus.Reply(new ProcessThisThingReply(request.Thing, request.SagaId)));

            Configure.With(handlerActivator)
            .Logging(l => l.None())
            .Transport(t => t.UseInMemoryTransport(network, "processor"))
            .Start();

            var sagaActivator = Using(new BuiltinHandlerActivator());

            sagaActivator.Register((bus, context) => new TypicalContendedSagaExample(bus));

            Configure.With(sagaActivator)
            .Logging(l => l.Use(loggerFactory))
            .Transport(t => t.UseInMemoryTransport(network, "lock-test"))
            .Sagas(s =>
            {
                s.StoreInMySql(MySqlTestHelper.ConnectionString, _dataTableName, _indexTableName);
                s.EnforceExclusiveAccess(c =>
                {
                    var options            = new MySqlExclusiveAccessLockOptions(MySqlTestHelper.ConnectionString);
                    var rebusLoggerFactory = c.Get <IRebusLoggerFactory>();
                    var connectionProvider = options.ConnectionProviderFactory(c);
                    var asyncTaskFactory   = c.Get <IAsyncTaskFactory>();
                    var rebusTime          = c.Get <IRebusTime>();
                    var locker             = new MySqlExclusiveAccessLock(connectionProvider, _lockTableName, rebusLoggerFactory, asyncTaskFactory, rebusTime, options);
                    if (options.EnsureTablesAreCreated)
                    {
                        locker.EnsureTableIsCreated();
                    }
                    return(locker);
                });
            })
            .Routing(t => t.TypeBased().Map <ProcessThisThingRequest>("processor"))
            .Options(o =>
            {
                o.SetMaxParallelism(100);
                o.SetNumberOfWorkers(10);
            })
            .Start();

            await sagaActivator.Bus.SendLocal(new ProcessTheseThings(Enumerable.Range(0, 10).Select(no => $"THING-{no}")));

            await Task.Delay(TimeSpan.FromSeconds(System.Diagnostics.Debugger.IsAttached ? 30 : 3));

            Assert.That(loggerFactory.Count(l => l.Level >= LogLevel.Warn), Is.EqualTo(0), "Didn't expect any logging with level WARNING or above");
        }
コード例 #2
0
        public async Task TestLockFunctions()
        {
            var rebusTime            = new DefaultRebusTime();
            var consoleLoggerFactory = new ConsoleLoggerFactory(false);
            var connectionProvider   = new DbConnectionProvider(MySqlTestHelper.ConnectionString, consoleLoggerFactory);
            var asyncTaskFactory     = new TplAsyncTaskFactory(consoleLoggerFactory);

            // Create a MySQL locker
            var locker = new MySqlExclusiveAccessLock(connectionProvider, _lockTableName, consoleLoggerFactory, asyncTaskFactory, rebusTime, new MySqlExclusiveAccessLockOptions(connectionProvider));

            locker.EnsureTableIsCreated();

            // Try the check function which will return false initially
            const string lockName = "my_lock";
            var          result   = await locker.IsLockAcquiredAsync(lockName, CancellationToken.None);

            Assert.That(result, Is.False);

            // Get the lock once
            result = await locker.AcquireLockAsync(lockName, CancellationToken.None);

            Assert.That(result, Is.True);

            // Try to get it again, and it should fail
            result = await locker.AcquireLockAsync(lockName, CancellationToken.None);

            Assert.That(result, Is.False);

            // Try the check function
            result = await locker.IsLockAcquiredAsync(lockName, CancellationToken.None);

            Assert.That(result, Is.True);

            // Now release the lock
            await locker.ReleaseLockAsync(lockName);

            // Try the check function and it should be false now
            result = await locker.IsLockAcquiredAsync(lockName, CancellationToken.None);

            Assert.That(result, Is.False);
        }