/// <summary> /// Adds the specified message. /// </summary> /// <param name="message">The message.</param> /// <param name="outBoxTimeout"></param> /// <returns>Task.</returns> public void Add(Message message, int outBoxTimeout = -1) { var parameters = InitAddDbParameters(message); var connection = _connectionProvider.GetConnection(); if (connection.State != ConnectionState.Open) { connection.Open(); } using (var command = InitAddDbCommand(connection, parameters)) { try { if (_connectionProvider.HasOpenTransaction) { command.Transaction = _connectionProvider.GetTransaction(); } command.ExecuteNonQuery(); } catch (SqlException sqlException) { if (sqlException.Number == MsSqlDuplicateKeyError_UniqueIndexViolation || sqlException.Number == MsSqlDuplicateKeyError_UniqueConstraintViolation) { s_logger.LogWarning( "MsSqlOutbox: A duplicate Message with the MessageId {Id} was inserted into the Outbox, ignoring and continuing", message.Id); return; } throw; } finally { if (!_connectionProvider.IsSharedConnection) { connection.Dispose(); } else if (!_connectionProvider.HasOpenTransaction) { connection.Close(); } } } }
/// <summary> /// Returns all messages in the store /// </summary> /// <param name="pageSize">Number of messages to return in search results (default = 100)</param> /// <param name="pageNumber">Page number of results to return (default = 1)</param> /// <param name="args">Additional parameters required for search, if any</param> /// <param name="cancellationToken">Cancellation Token</param> /// <returns></returns> public async Task <IList <Message> > GetAsync( int pageSize = 100, int pageNumber = 1, Dictionary <string, object> args = null, CancellationToken cancellationToken = default(CancellationToken)) { var connection = await _connectionProvider.GetConnectionAsync(cancellationToken); using (var command = connection.CreateCommand()) { CreatePagedReadCommand(command, pageSize, pageNumber); if (connection.State != ConnectionState.Open) { await connection.OpenAsync(cancellationToken).ConfigureAwait(ContinueOnCapturedContext); } if (_connectionProvider.HasOpenTransaction) { command.Transaction = _connectionProvider.GetTransaction(); } var dbDataReader = await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(ContinueOnCapturedContext); var messages = new List <Message>(); while (await dbDataReader.ReadAsync(cancellationToken)) { messages.Add(MapAMessage(dbDataReader)); } dbDataReader.Close(); if (!_connectionProvider.IsSharedConnection) { connection.Dispose(); } else if (!_connectionProvider.HasOpenTransaction) { connection.Close(); } return(messages); } }