public void Dispose() { Release(); if (_storage != null) { _storage.ReleaseConnection(_connection); } }
public void Dispose() { if (_disposed) { return; } if (!_removedFromQueue && !_requeued) { Requeue(); } _storage.ReleaseConnection(_connection); _disposed = true; }
public IFetchedJob Dequeue(string[] queues, CancellationToken cancellationToken) { if (queues == null) { throw new ArgumentNullException("queues"); } if (queues.Length == 0) { throw new ArgumentException("Queue array must be non-empty.", "queues"); } FetchedJob fetchedJob = null; MySqlConnection connection = null; do { cancellationToken.ThrowIfCancellationRequested(); connection = _storage.CreateAndOpenConnection(); try { using (new MySqlDistributedLock(_storage, "JobQueue", TimeSpan.FromSeconds(30), _options)) { string token = Guid.NewGuid().ToString(); int nUpdated = connection.Execute( $"update `{_options.TablesPrefix}JobQueue` set FetchedAt = UTC_TIMESTAMP(), FetchToken = @fetchToken " + "where (FetchedAt is null or FetchedAt < DATE_ADD(UTC_TIMESTAMP(), INTERVAL @timeout SECOND)) " + " and Queue in @queues " + "LIMIT 1;", new { queues = queues, timeout = _options.InvisibilityTimeout.Negate().TotalSeconds, fetchToken = token }); if (nUpdated != 0) { fetchedJob = connection .Query <FetchedJob>( "select Id, JobId, Queue " + $"from `{_options.TablesPrefix}JobQueue` " + "where FetchToken = @fetchToken;", new { fetchToken = token }) .SingleOrDefault(); } } } catch (MySqlException ex) { Logger.ErrorException(ex.Message, ex); _storage.ReleaseConnection(connection); throw; } if (fetchedJob == null) { _storage.ReleaseConnection(connection); cancellationToken.WaitHandle.WaitOne(_options.QueuePollInterval); cancellationToken.ThrowIfCancellationRequested(); } } while (fetchedJob == null); return(new MySqlFetchedJob(_storage, connection, fetchedJob, _options)); }