private void HandleForTransaction(MoveRecordToErrorQueueCommand <long> command)
        {
            var connHolder = command.MessageContext.Get(_headers.Connection);

            using (var conn = _dbConnectionFactory.Create())
            {
                conn.Open();
                using (var commandSql = conn.CreateCommand())
                {
                    _prepareCommand.Handle(command, commandSql, CommandStringTypes.MoveToErrorQueue);
                    var iCount = commandSql.ExecuteNonQuery();
                    if (iCount != 1)
                    {
                        return;
                    }

                    //the record is now in the error queue, remove it from the main queue
                    _deleteMetaCommandHandler.Handle(new DeleteMetaDataCommand(command.QueueId, connHolder.Connection, connHolder.Transaction));

                    //commit the original transaction
                    connHolder.Transaction.Commit();
                    connHolder.Transaction.Dispose();
                    connHolder.Transaction = null;

                    if (_options.Value.EnableStatusTable)
                    {
                        _setStatusNoTransactionCommandHandler.Handle(new SetStatusTableStatusCommand <long>(command.QueueId, QueueStatuses.Error));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void Create_Default(string number)
        {
            var id   = new RedisQueueId(number);
            var test = new MoveRecordToErrorQueueCommand(id);

            Assert.Equal(id, test.QueueId);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Handles the specified command.
 /// </summary>
 /// <param name="command">The command.</param>
 public void Handle(MoveRecordToErrorQueueCommand <long> command)
 {
     if (!_databaseExists.Exists(_connectionInformation.ConnectionString))
     {
         return;
     }
     _decorated.Handle(command);
 }
Ejemplo n.º 4
0
        public void Create_Default(string number)
        {
            var error   = new Exception();
            var context = Substitute.For <IMessageContext>();
            var test    = new MoveRecordToErrorQueueCommand <string>(error, number, context);

            Assert.Equal(number, test.QueueId);
            Assert.Equal(error, test.Exception);
            Assert.Equal(context, test.MessageContext);
        }
        public void Create_Default()
        {
            const int id      = 19334;
            var       error   = new Exception();
            var       context = Substitute.For <IMessageContext>();
            var       test    = new MoveRecordToErrorQueueCommand(error, id, context);

            Assert.Equal(id, test.QueueId);
            Assert.Equal(error, test.Exception);
            Assert.Equal(context, test.MessageContext);
        }
        /// <inheritdoc />
        public void Handle(MoveRecordToErrorQueueCommand<long> command, IDbCommand dbCommand, CommandStringTypes commandType)
        {
            dbCommand.CommandText = _buildSql.Create();

            var queueId = dbCommand.CreateParameter();
            queueId.ParameterName = "@QueueID";
            queueId.DbType = DbType.Int64;
            queueId.Value = command.QueueId;
            dbCommand.Parameters.Add(queueId);

            var exception = dbCommand.CreateParameter();
            exception.ParameterName = "@LastException";
            exception.DbType = DbType.AnsiString;
            exception.Value = command.Exception.ToString();
            dbCommand.Parameters.Add(exception);
        }
        /// <inheritdoc />
        public void Handle(MoveRecordToErrorQueueCommand <long> command)
        {
            if (_options.Value.EnableHoldTransactionUntilMessageCommitted)
            {
                HandleForTransaction(command);
            }
            else
            {
                using (var conn = _dbConnectionFactory.Create())
                {
                    conn.Open();
                    using (var trans = _transactionFactory.Create(conn).BeginTransaction())
                    {
                        using (var commandSql = conn.CreateCommand())
                        {
                            commandSql.Transaction = trans;
                            _prepareCommand.Handle(command, commandSql, CommandStringTypes.MoveToErrorQueue);
                            var iCount = commandSql.ExecuteNonQuery();
                            if (iCount != 1)
                            {
                                return;
                            }

                            //the record is now in the error queue, remove it from the main queue
                            _deleteMetaCommandHandler.Handle(new DeleteMetaDataCommand(command.QueueId, conn, trans));

                            if (!_options.Value.EnableStatusTable)
                            {
                                trans.Commit();
                                return;
                            }

                            //update the status record
                            _setStatusCommandHandler.Handle(new SetStatusTableStatusTransactionCommand(command.QueueId, conn, QueueStatuses.Error, trans));
                        }
                        trans.Commit();
                    }
                }
            }
        }
        /// <summary>
        /// Handles the specified command.
        /// </summary>
        /// <param name="command">The command.</param>
        /// <param name="dbCommand">The database command.</param>
        /// <param name="commandType">Type of the command.</param>
        public void Handle(MoveRecordToErrorQueueCommand <long> command, IDbCommand dbCommand, CommandStringTypes commandType)
        {
            dbCommand.CommandText = _buildSql.Create();
            var commandSql = dbCommand;

            var param = commandSql.CreateParameter();

            param.ParameterName = "@QueueID";
            param.DbType        = DbType.Int64;
            param.Value         = command.QueueId;
            commandSql.Parameters.Add(param);

            param = commandSql.CreateParameter();
            param.ParameterName = "@LastException";
            param.DbType        = DbType.String;
            param.Value         = command.Exception.ToString();
            commandSql.Parameters.Add(param);

            param = commandSql.CreateParameter();
            param.ParameterName = "@CurrentDateTime";
            param.DbType        = DbType.Int64;
            param.Value         = _getTime.GetCurrentUtcDate().Ticks;
            commandSql.Parameters.Add(param);
        }
Ejemplo n.º 9
0
        /// <inheritdoc />
        public void Handle(MoveRecordToErrorQueueCommand <int> command)
        {
            using (var db = _connectionInformation.GetDatabase())
            {
                bool delete = false;
                db.Database.BeginTrans();
                try
                {
                    var meta    = db.Database.GetCollection <MetaDataTable>(_tableNameHelper.MetaDataName);
                    var results = meta.Query()
                                  .Where(x => x.QueueId == command.QueueId)
                                  .ToList();

                    if (results != null && results.Count == 1)
                    {
                        //move record to error table
                        var errorRecord = new MetaDataErrorsTable()
                        {
                            LastExceptionDate = DateTime.UtcNow,
                            LastException     = command.Exception.ToString(),
                            QueueId           = results[0].QueueId,
                            Status            = QueueStatuses.Error,
                            CorrelationId     = results[0].CorrelationId,
                            HeartBeat         = results[0].HeartBeat,
                            ExpirationTime    = results[0].ExpirationTime,
                            QueueProcessTime  = results[0].QueueProcessTime,
                            QueuedDateTime    = results[0].QueuedDateTime,
                            Route             = results[0].Route
                        };

                        var errorCol =
                            db.Database.GetCollection <MetaDataErrorsTable>(_tableNameHelper.MetaDataErrorsName);
                        errorCol.Insert(errorRecord);

                        //delete record from metadata table
                        delete = meta.Delete(results[0].Id);

                        //update status table
                        if (_options.Value.EnableStatusTable)
                        {
                            var colStatus     = db.Database.GetCollection <StatusTable>(_tableNameHelper.StatusName);
                            var resultsStatus = colStatus.Query()
                                                .Where(x => x.QueueId == command.QueueId)
                                                .ToList();

                            if (resultsStatus != null && resultsStatus.Count == 1)
                            {
                                resultsStatus[0].Status = QueueStatuses.Error;
                                colStatus.Update(resultsStatus[0]);
                            }
                        }
                    }

                    if (delete)
                    {
                        db.Database.Commit();
                    }
                    else
                    {
                        db.Database.Rollback();
                    }
                }
                catch
                {
                    db.Database.Rollback();
                    throw;
                }
            }
        }
Ejemplo n.º 10
0
 /// <inheritdoc />
 public void Handle(MoveRecordToErrorQueueCommand <string> command)
 {
     _errorLua.Execute(command.QueueId, _unixTime.GetCurrentUnixTimestampMilliseconds());
 }