public ReceiveResult TryReceiveFrom(TableBasedQueue queue) { MessageReadResult readResult; using (var connection = new SqlConnection(connectionString)) { connection.Open(); readResult = queue.TryReceive(connection); if (readResult.IsPoison) { errorQueue.Send(readResult.DataRecord, connection); return ReceiveResult.NoMessage(); } } if (!readResult.Successful) { return ReceiveResult.NoMessage(); } var result = ReceiveResult.Received(readResult.Message); try { tryProcessMessageCallback(readResult.Message); return result; } catch (Exception ex) { return result.FailedProcessing(ex); } }
static async Task ReceiveWithLongHandling(TableBasedQueue tableBasedQueue) { await ExecuteInTransactionScope(async c => { await tableBasedQueue.TryReceive(c, null); await Task.Delay(TimeSpan.FromSeconds(ReceiveDelayInSeconds)); }); }
public ReceiveResult TryReceiveFrom(TableBasedQueue queue) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (pipelineExecutor.SetConnection(connectionString, connection)) { using (var transaction = connection.BeginTransaction(isolationLevel)) { using (pipelineExecutor.SetTransaction(connectionString, transaction)) { MessageReadResult readResult; try { readResult = queue.TryReceive(connection, transaction); } catch (Exception) { transaction.Rollback(); throw; } if (readResult.IsPoison) { errorQueue.Send(readResult.DataRecord, connection, transaction); transaction.Commit(); return ReceiveResult.NoMessage(); } if (!readResult.Successful) { transaction.Commit(); return ReceiveResult.NoMessage(); } var result = ReceiveResult.Received(readResult.Message); try { if (tryProcessMessageCallback(result.Message)) { transaction.Commit(); } else { transaction.Rollback(); } return result; } catch (Exception ex) { transaction.Rollback(); return result.FailedProcessing(ex); } } } } } }
static async Task ReceiveWithLongHandling(TableBasedQueue tableBasedQueue, SqlConnectionFactory sqlConnectionFactory) { using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) { using (var connection = await sqlConnectionFactory.OpenNewConnection()) using (var tx = connection.BeginTransaction()) { await tableBasedQueue.TryReceive(connection, tx); await Task.Delay(TimeSpan.FromSeconds(ReceiveDelayInSeconds)); tx.Commit(); scope.Complete(); } } }
public ReceiveResult TryReceiveFrom(TableBasedQueue queue) { using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (pipelineExecutor.SetConnection(connectionString, connection)) { var readResult = queue.TryReceive(connection); if (readResult.IsPoison) { errorQueue.Send(readResult.DataRecord, connection); scope.Complete(); return ReceiveResult.NoMessage(); } if (!readResult.Successful) { scope.Complete(); return ReceiveResult.NoMessage(); } var result = ReceiveResult.Received(readResult.Message); try { if (tryProcessMessageCallback(readResult.Message)) { scope.Complete(); scope.Dispose(); // We explicitly calling Dispose so that we force any exception to not bubble, eg Concurrency/Deadlock exception. } return result; } catch (Exception ex) { return result.FailedProcessing(ex); } } } } }