protected override async Task<Lease> AcquireLease() { using (var connection = new SqlConnection(settings.ConnectionString)) { await connection.OpenAsync(); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = @"Alluvial.AcquireLease"; cmd.Parameters.AddWithValue(@"@waitIntervalMilliseconds", waitInterval.TotalMilliseconds); cmd.Parameters.AddWithValue(@"@leaseDurationMilliseconds", defaultLeaseDuration.TotalMilliseconds); cmd.Parameters.AddWithValue(@"@scope", scope); using (var reader = await cmd.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var resourceName = await reader.GetFieldValueAsync<string>(0); var leaseLastGranted = await reader.GetFieldValueAsync<dynamic>(2); var leaseLastReleased = await reader.GetFieldValueAsync<dynamic>(3); var token = await reader.GetFieldValueAsync<dynamic>(5); var resource = new LeasableResource( resourceName, defaultLeaseDuration) { LeaseLastGranted = leaseLastGranted is DBNull ? DateTimeOffset.MinValue : (DateTimeOffset) leaseLastGranted, LeaseLastReleased = leaseLastReleased is DBNull ? DateTimeOffset.MinValue : (DateTimeOffset) leaseLastReleased }; Lease lease = null; lease = new Lease(resource, resource.DefaultLeaseDuration, (int) token, extend: by => ExtendLease(lease, @by)); return lease; } } return null; } }
public SqlBrokeredStreamQueryDistributor( LeasableResource[] leasableResources, SqlBrokeredStreamQueryDistributorDatabase settings, string scope, int maxDegreesOfParallelism = 5, TimeSpan? waitInterval = null, TimeSpan? defaultLeaseDuration = null) : base(leasableResources, maxDegreesOfParallelism, waitInterval) { if (settings == null) { throw new ArgumentNullException("settings"); } if (scope == null) { throw new ArgumentNullException("scope"); } this.settings = settings; this.scope = scope; this.defaultLeaseDuration = defaultLeaseDuration ?? TimeSpan.FromMinutes(5); }