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