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)); } } } }
public void Create_Default(string number) { var id = new RedisQueueId(number); var test = new MoveRecordToErrorQueueCommand(id); Assert.Equal(id, test.QueueId); }
/// <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); }
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); }
/// <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; } } }
/// <inheritdoc /> public void Handle(MoveRecordToErrorQueueCommand <string> command) { _errorLua.Execute(command.QueueId, _unixTime.GetCurrentUnixTimestampMilliseconds()); }