Ejemplo n.º 1
0
        /// <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();
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }