本文整理汇总了C#中ITransactionContext.OnCommitted方法的典型用法代码示例。如果您正苦于以下问题:C# ITransactionContext.OnCommitted方法的具体用法?C# ITransactionContext.OnCommitted怎么用?C# ITransactionContext.OnCommitted使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ITransactionContext
的用法示例。
在下文中一共展示了ITransactionContext.OnCommitted方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Send
/// <summary>
/// Sends the given <see cref="TransportMessage"/> to the queue with the specified globally addressable name
/// </summary>
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
context.OnCommitted(async () =>
{
var headers = message.Headers.Clone();
var queue = GetQueue(destinationAddress);
var messageId = Guid.NewGuid().ToString();
var popReceipt = Guid.NewGuid().ToString();
var timeToBeReceivedOrNull = GetTimeToBeReceivedOrNull(headers);
var queueVisibilityDelayOrNull = GetQueueVisibilityDelayOrNull(headers);
var cloudQueueMessage = Serialize(messageId, popReceipt, headers, message.Body);
try
{
var options = new QueueRequestOptions {RetryPolicy = new ExponentialRetry()};
var operationContext = new OperationContext();
await queue.AddMessageAsync(cloudQueueMessage, timeToBeReceivedOrNull, queueVisibilityDelayOrNull, options, operationContext);
}
catch (Exception exception)
{
throw new RebusApplicationException(exception, $"Could not send message with ID {cloudQueueMessage.Id} to '{destinationAddress}'");
}
});
}
示例2: Send
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
var outgoingMessages = context.GetOrAdd(OutgoingMessagesItemsKey, () =>
{
context.OnCommitted(async () => SendOutgoingMessages(context));
return new ConcurrentQueue<OutgoingMessage>();
});
outgoingMessages.Enqueue(new OutgoingMessage(destinationAddress, message));
}
示例3: Send
/// <summary>
/// Delivers the given message to the queue identitied by the given <paramref name="destinationAddress"/>
/// </summary>
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
if (destinationAddress == null) throw new ArgumentNullException("destinationAddress");
if (message == null) throw new ArgumentNullException("message");
if (context == null) throw new ArgumentNullException("context");
if (!_network.HasQueue(destinationAddress))
{
throw new ArgumentException(string.Format("Destination queue address '{0}' does not exist!", destinationAddress));
}
context.OnCommitted(async () => _network.Deliver(destinationAddress, message.ToInMemTransportMessage()));
}
示例4: Send
/// <summary>
/// Sends the specified message to the logical queue specified by <paramref name="destinationQueueName"/> by writing
/// a JSON serialied text to a file in the corresponding directory. The actual write operation is delayed until
/// the commit phase of the queue transaction unless we're non-transactional, in which case it is written immediately.
/// </summary>
public async Task Send(string destinationQueueName, TransportMessage message, ITransactionContext context)
{
EnsureQueueInitialized(destinationQueueName);
var destinationDirectory = GetDirectoryForQueueNamed(destinationQueueName);
var serializedMessage = Serialize(message);
var fileName = GetNextFileName();
var fullPath = Path.Combine(destinationDirectory, fileName);
context.OnCommitted(async () =>
{
using (var stream = File.OpenWrite(fullPath))
using (var writer = new StreamWriter(stream, FavoriteEncoding))
{
await writer.WriteAsync(serializedMessage);
}
});
}
示例5: Send
/// <summary>
/// Sends the given <see cref="TransportMessage"/> to the queue with the specified globally addressable name
/// </summary>
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
context.OnCommitted(async () =>
{
var queue = GetQueue(destinationAddress);
var messageId = Guid.NewGuid().ToString();
var popReceipt = Guid.NewGuid().ToString();
var timeToBeReceived = GetTimeToBeReceivedOrNull(message);
var cloudQueueMessage = Serialize(message, messageId, popReceipt);
try
{
var options = new QueueRequestOptions {RetryPolicy = new ExponentialRetry()};
var operationContext = new OperationContext();
await queue.AddMessageAsync(cloudQueueMessage, timeToBeReceived, null, options, operationContext);
}
catch (Exception exception)
{
throw new RebusApplicationException(string.Format("Could not send message with ID {0} to '{1}'", cloudQueueMessage.Id, destinationAddress), exception);
}
});
}
示例6: GetConnection
Task<IDbConnection> GetConnection(ITransactionContext context)
{
return context
.GetOrAdd(CurrentConnectionKey,
async () =>
{
var dbConnection = await _connectionProvider.GetConnection();
context.OnCommitted(async () => await dbConnection.Complete());
context.OnDisposed(() =>
{
dbConnection.Dispose();
});
return dbConnection;
});
}
示例7: Send
public Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
if (destinationAddress == null) throw new ArgumentNullException("destinationAddress");
if (message == null) throw new ArgumentNullException("message");
if (context == null) throw new ArgumentNullException("context");
var outputQueue = context.GetOrAdd(OutgoingQueueContextKey, () => new InMemOutputQueue());
var contextActionsSet = context.GetOrAdd(OutgoingQueueContextActionIsSetKey, () => false);
if (!contextActionsSet)
{
context.OnCommitted(async () =>
{
var client = GetClientFromTransactionContext(context);
var messageSendRequests = outputQueue.GetMessages();
var tasks = messageSendRequests.Select(r => client.SendMessageBatchAsync(new SendMessageBatchRequest(r.DestinationAddressUrl, r.Messages.ToList())));
var response = await Task.WhenAll(tasks);
if (response.Any(r => r.Failed.Any()))
{
GenerateErrorsAndThrow(response);
}
});
context.OnAborted(outputQueue.Clear);
context.Items[OutgoingQueueContextActionIsSetKey] = true;
}
var sendMessageRequest = new SendMessageBatchRequestEntry()
{
MessageAttributes = CreateAttributesFromHeaders(message.Headers),
MessageBody = GetBody(message.Body),
Id = message.Headers.GetValueOrNull(Headers.MessageId) ?? Guid.NewGuid().ToString(),
};
outputQueue.AddMessage(GetDestinationQueueUrlByName(destinationAddress, context), sendMessageRequest);
return _emptyTask;
}
示例8: Receive
/// <summary>
/// Received the next available transport message from the input queue via MSMQ. Will create a new <see cref="MessageQueueTransaction"/> and stash
/// it under the <see cref="CurrentTransactionKey"/> key in the given <paramref name="context"/>. If one already exists, an exception will be thrown
/// (because we should never have to receive multiple messages in the same transaction)
/// </summary>
public async Task<TransportMessage> Receive(ITransactionContext context)
{
if (context == null) throw new ArgumentNullException("context");
if (_inputQueueName == null)
{
throw new InvalidOperationException("This MSMQ transport does not have an input queue, hence it is not possible to reveive anything");
}
var queue = GetInputQueue();
if (context.Items.ContainsKey(CurrentTransactionKey))
{
throw new InvalidOperationException("Tried to receive with an already existing MSMQ queue transaction - while that is possible, it's an indication that something is wrong!");
}
var messageQueueTransaction = new MessageQueueTransaction();
messageQueueTransaction.Begin();
context.OnCommitted(async () => messageQueueTransaction.Commit());
context.OnDisposed(() => messageQueueTransaction.Dispose());
context.Items[CurrentTransactionKey] = messageQueueTransaction;
try
{
var message = queue.Receive(TimeSpan.FromSeconds(1), messageQueueTransaction);
if (message == null)
{
messageQueueTransaction.Abort();
return null;
}
var headers = _extensionSerializer.Deserialize(message.Extension, message.Id);
var body = new byte[message.BodyStream.Length];
await message.BodyStream.ReadAsync(body, 0, body.Length);
return new TransportMessage(headers, body);
}
catch (MessageQueueException exception)
{
if (exception.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
return null;
}
if (exception.MessageQueueErrorCode == MessageQueueErrorCode.InvalidHandle)
{
_log.Info("Queue handle for '{0}' was invalid - will try to reinitialize the queue", _inputQueueName);
ReinitializeInputQueue();
}
if (exception.MessageQueueErrorCode == MessageQueueErrorCode.QueueDeleted)
{
_log.Warn("Queue '{0}' was deleted - will not receive any more messages", _inputQueueName);
return null;
}
throw new IOException(
string.Format("Could not receive next message from MSMQ queue '{0}'", _inputQueueName),
exception);
}
}
示例9: Send
/// <summary>
/// Sends the given transport message to the specified destination address using MSMQ. Will use the existing <see cref="MessageQueueTransaction"/> stashed
/// under the <see cref="CurrentTransactionKey"/> key in the given <paramref name="context"/>, or else it will create one and add it.
/// </summary>
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
if (destinationAddress == null) throw new ArgumentNullException("destinationAddress");
if (message == null) throw new ArgumentNullException("message");
if (context == null) throw new ArgumentNullException("context");
var logicalMessage = CreateMsmqMessage(message);
var messageQueueTransaction = context.GetOrAdd(CurrentTransactionKey, () =>
{
var messageQueueTransaction1 = new MessageQueueTransaction();
messageQueueTransaction1.Begin();
context.OnCommitted(async () => messageQueueTransaction1.Commit());
return messageQueueTransaction1;
});
var sendQueues = context.GetOrAdd(CurrentOutgoingQueuesKey, () =>
{
var messageQueues = new ConcurrentDictionary<string, MessageQueue>(StringComparer.InvariantCultureIgnoreCase);
context.OnDisposed(() =>
{
foreach (var messageQueue in messageQueues.Values)
{
messageQueue.Dispose();
}
});
return messageQueues;
});
var path = MsmqUtil.GetFullPath(destinationAddress);
var sendQueue = sendQueues.GetOrAdd(path, _ =>
{
var messageQueue = new MessageQueue(path, QueueAccessMode.Send);
return messageQueue;
});
sendQueue.Send(logicalMessage, messageQueueTransaction);
}
示例10: GetOutgoingMessages
ConcurrentDictionary<string, ConcurrentQueue<TransportMessage>> GetOutgoingMessages(ITransactionContext context)
{
return context.GetOrAdd(OutgoingMessagesKey, () =>
{
var destinations = new ConcurrentDictionary<string, ConcurrentQueue<TransportMessage>>();
context.OnCommitted(async () =>
{
// send outgoing messages
foreach (var destinationAndMessages in destinations)
{
var destinationAddress = destinationAndMessages.Key;
var messages = destinationAndMessages.Value;
_log.Debug("Sending {0} messages to {1}", messages.Count, destinationAddress);
var sendTasks = messages
.Select(async message =>
{
await GetRetrier().Execute(async () =>
{
using (var brokeredMessageToSend = CreateBrokeredMessage(message))
{
await GetQueueClient(destinationAddress).SendAsync(brokeredMessageToSend);
}
});
})
.ToArray();
await Task.WhenAll(sendTasks);
}
});
return destinations;
});
}
示例11: Receive
public async Task<TransportMessage> Receive(ITransactionContext context)
{
using (await _bottleneck.Enter())
{
var brokeredMessage = await ReceiveBrokeredMessage();
if (brokeredMessage == null) return null;
var headers = brokeredMessage.Properties
.Where(kvp => kvp.Value is string)
.ToDictionary(kvp => kvp.Key, kvp => (string)kvp.Value);
var messageId = headers.GetValueOrNull(Headers.MessageId);
_log.Debug("Received brokered message with ID {0}", messageId);
var leaseDuration = (brokeredMessage.LockedUntilUtc - DateTime.UtcNow);
var lockRenewalInterval = TimeSpan.FromMinutes(0.8 * leaseDuration.TotalMinutes);
var renewalTask = GetRenewalTaskOrFakeDisposable(messageId, brokeredMessage, lockRenewalInterval);
context.OnAborted(() =>
{
renewalTask.Dispose();
_log.Debug("Abandoning message with ID {0}", messageId);
try
{
brokeredMessage.Abandon();
}
catch (Exception exception)
{
// if it fails, it'll be back on the queue anyway....
_log.Warn("Could not abandon message: {0}", exception);
}
});
context.OnCommitted(async () =>
{
renewalTask.Dispose();
});
context.OnCompleted(async () =>
{
_log.Debug("Completing message with ID {0}", messageId);
await GetRetrier().Execute(() => brokeredMessage.CompleteAsync());
});
context.OnDisposed(() =>
{
renewalTask.Dispose();
_log.Debug("Disposing message with ID {0}", messageId);
brokeredMessage.Dispose();
});
return new TransportMessage(headers, brokeredMessage.GetBody<byte[]>());
}
}
示例12: Receive
public async Task<TransportMessage> Receive(ITransactionContext context)
{
if (_inputQueueAddress == null)
{
throw new InvalidOperationException("This Azure Service Bus transport does not have an input queue, hence it is not possible to reveive anything");
}
using (await _bottleneck.Enter())
{
var brokeredMessage = await ReceiveBrokeredMessage();
if (brokeredMessage == null) return null;
var headers = brokeredMessage.Properties
.Where(kvp => kvp.Value is string)
.ToDictionary(kvp => kvp.Key, kvp => (string)kvp.Value);
var messageId = headers.GetValueOrNull(Headers.MessageId);
var leaseDuration = (brokeredMessage.LockedUntilUtc - DateTime.UtcNow);
var lockRenewalInterval = TimeSpan.FromMinutes(0.8 * leaseDuration.TotalMinutes);
var renewalTask = GetRenewalTaskOrFakeDisposable(messageId, brokeredMessage, lockRenewalInterval);
context.OnAborted(() =>
{
renewalTask.Dispose();
try
{
brokeredMessage.Abandon();
}
catch (Exception exception)
{
// if it fails, it'll be back on the queue anyway....
_log.Warn("Could not abandon message: {0}", exception);
}
});
context.OnCommitted(async () => renewalTask.Dispose());
context.OnCompleted(async () =>
{
await brokeredMessage.CompleteAsync();
});
context.OnDisposed(() =>
{
renewalTask.Dispose();
brokeredMessage.Dispose();
});
using (var memoryStream = new MemoryStream())
{
await brokeredMessage.GetBody<Stream>().CopyToAsync(memoryStream);
return new TransportMessage(headers, memoryStream.ToArray());
}
}
}
示例13: GetOutgoingMessages
ConcurrentDictionary<string, ConcurrentQueue<TransportMessage>> GetOutgoingMessages(ITransactionContext context)
{
return context.GetOrAdd(OutgoingMessagesKey, () =>
{
var destinations = new ConcurrentDictionary<string, ConcurrentQueue<TransportMessage>>();
context.OnCommitted(async () =>
{
// send outgoing messages
foreach (var destinationAndMessages in destinations)
{
var destinationAddress = destinationAndMessages.Key;
var messages = destinationAndMessages.Value;
var sendTasks = messages
.Select(async message =>
{
await GetRetrier().Execute(async () =>
{
using (var brokeredMessageToSend = CreateBrokeredMessage(message))
{
try
{
await Send(destinationAddress, brokeredMessageToSend);
}
catch (MessagingEntityNotFoundException exception)
{
throw new MessagingEntityNotFoundException($"Could not send to '{destinationAddress}'!", exception);
}
}
});
})
.ToArray();
await Task.WhenAll(sendTasks);
}
});
return destinations;
});
}
示例14: Send
public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
{
if (destinationAddress == null) throw new ArgumentNullException(nameof(destinationAddress));
if (message == null) throw new ArgumentNullException(nameof(message));
if (context == null) throw new ArgumentNullException(nameof(context));
var outgoingMessages = context.GetOrAdd(OutgoingMessagesItemsKey, () =>
{
var sendMessageBatchRequestEntries = new ConcurrentQueue<OutgoingMessage>();
context.OnCommitted(async () =>
{
await SendOutgoingMessages(sendMessageBatchRequestEntries, context);
});
return sendMessageBatchRequestEntries;
});
outgoingMessages.Enqueue(new OutgoingMessage(destinationAddress, message));
}
示例15: Receive
public async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken = default(CancellationToken))
{
if (Address == null)
{
throw new InvalidOperationException("This RabbitMQ transport does not have an input queue - therefore, it is not possible to reveive anything");
}
try
{
EnsureConsumerInitialized();
var consumer = _consumer;
// initialization must have failed
if (consumer == null) return null;
var model = consumer.Model;
if (!model.IsOpen)
{
// something is wrong - we would not be able to ACK messages - force re-initialization to happen
_consumer = null;
// try to get rid of the consumer we have here
try
{
model.Dispose();
}
catch { }
}
BasicDeliverEventArgs result;
if (!consumer.Queue.Dequeue(TwoSeconds, out result)) return null;
var deliveryTag = result.DeliveryTag;
context.OnCommitted(async () =>
{
model.BasicAck(deliveryTag, false);
});
context.OnAborted(() =>
{
// we might not be able to do this, but it doesn't matter that much if it succeeds
try
{
model.BasicNack(deliveryTag, false, true);
}
catch { }
});
return CreateTransportMessage(result);
}
catch (EndOfStreamException exception)
{
ClearConsumer();
throw new RebusApplicationException(exception,
"Queue throw EndOfStreamException(meaning it was canceled by rabbitmq)");
}
catch (Exception exception)
{
ClearConsumer();
Thread.Sleep(1000);
throw new RebusApplicationException(exception,
$"unexpected exception thrown while trying to dequeue a message from rabbitmq, queue address: {Address}");
}
}