本文整理汇总了C#中ITransactionContext.OnAborted方法的典型用法代码示例。如果您正苦于以下问题:C# ITransactionContext.OnAborted方法的具体用法?C# ITransactionContext.OnAborted怎么用?C# ITransactionContext.OnAborted使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ITransactionContext
的用法示例。
在下文中一共展示了ITransactionContext.OnAborted方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Receive
/// <summary>
/// Receives the next message from the queue identified by the configured <see cref="Address"/>, returning null if none was available
/// </summary>
public async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (_inputQueueAddress == null) throw new InvalidOperationException("This in-mem transport is initialized without an input queue, hence it is not possible to receive anything!");
var nextMessage = _network.GetNextOrNull(_inputQueueAddress);
if (nextMessage == null) return null;
context.OnAborted(() =>
{
_network.Deliver(_inputQueueAddress, nextMessage, alwaysQuiet: true);
});
return nextMessage.ToTransportMessage();
}
示例2: Receive
/// <summary>
/// Receives the next message from the queue identified by the configured <see cref="Address"/>, returning null if none was available
/// </summary>
public async Task<TransportMessage> Receive(ITransactionContext context)
{
if (context == null) throw new ArgumentNullException("context");
var nextMessage = _network.GetNextOrNull(_inputQueueAddress);
if (nextMessage != null)
{
context.OnAborted(() =>
{
_network.Deliver(_inputQueueAddress, nextMessage, alwaysQuiet: true);
});
return nextMessage.ToTransportMessage();
}
await Task.Delay(20);
return null;
}
示例3: Receive
/// <summary>
/// Receives the next message (if any) from the transport's input queue <see cref="ITransport.Address"/>
/// </summary>
public async Task<TransportMessage> Receive(ITransactionContext context)
{
var inputQueue = GetQueue(_inputQueueName);
var cloudQueueMessage = await inputQueue.GetMessageAsync(_initialVisibilityDelay, new QueueRequestOptions(), new OperationContext());
if (cloudQueueMessage == null) return null;
context.OnCompleted(async () =>
{
await inputQueue.DeleteMessageAsync(cloudQueueMessage);
});
context.OnAborted(() =>
{
inputQueue.UpdateMessage(cloudQueueMessage, TimeSpan.FromSeconds(0), MessageUpdateFields.Visibility);
});
return Deserialize(cloudQueueMessage);
}
示例4: Receive
public async Task<TransportMessage> Receive(ITransactionContext context)
{
if (context == null) throw new ArgumentNullException("context");
if (_inputQueueAddress == null)
{
throw new InvalidOperationException("This Amazon SQS transport does not have an input queue, hence it is not possible to reveive anything");
}
var client = GetClientFromTransactionContext(context);
var response = await client.ReceiveMessageAsync(new ReceiveMessageRequest(_queueUrl)
{
MaxNumberOfMessages = 1,
WaitTimeSeconds = 1,
AttributeNames = new List<string>(new[] { "All" }),
MessageAttributeNames = new List<string>(new[] { "All" })
});
if (response.Messages.Any())
{
var message = response.Messages.First();
var renewalTask = CreateRenewalTaskForMessage(message, client);
context.OnCompleted(async () =>
{
renewalTask.Dispose();
var result = await client.DeleteMessageBatchAsync(new DeleteMessageBatchRequest(_queueUrl,
response.Messages
.Select(m => new DeleteMessageBatchRequestEntry(m.MessageId, m.ReceiptHandle))
.ToList()));
if (result.Failed.Any())
{
GenerateErrorsAndLog(result);
}
});
context.OnAborted(() =>
{
renewalTask.Dispose();
var result = client.ChangeMessageVisibilityBatch(new ChangeMessageVisibilityBatchRequest(_queueUrl,
response.Messages
.Select(m => new ChangeMessageVisibilityBatchRequestEntry(m.MessageId, m.ReceiptHandle)
{
VisibilityTimeout = 0
}).ToList()));
if (result.Failed.Any())
{
GenerateErrorsAndLog(result);
}
});
if (MessageIsExpired(message))
{
await client.DeleteMessageAsync(new DeleteMessageRequest(_queueUrl, message.ReceiptHandle));
return null;
}
renewalTask.Start();
var transportMessage = GetTransportMessage(message);
return transportMessage;
}
return null;
}
示例5: 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;
}
示例6: 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[]>());
}
}
示例7: 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());
}
}
}
示例8: Receive
/// <summary>
/// Receives the next message (if any) from the transport's input queue <see cref="ITransport.Address"/>
/// </summary>
public async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken = default(CancellationToken))
{
if (_inputQueueName == null)
{
throw new InvalidOperationException("This Azure Storage Queues transport does not have an input queue, hence it is not possible to reveive anything");
}
var inputQueue = GetQueue(_inputQueueName);
var cloudQueueMessage = await inputQueue.GetMessageAsync(_initialVisibilityDelay, new QueueRequestOptions(), new OperationContext(), cancellationToken);
if (cloudQueueMessage == null) return null;
context.OnCompleted(async () =>
{
// if we get this far, don't pass on the cancellation token
await inputQueue.DeleteMessageAsync(cloudQueueMessage);
});
context.OnAborted(() =>
{
inputQueue.UpdateMessage(cloudQueueMessage, TimeSpan.FromSeconds(0), MessageUpdateFields.Visibility);
});
return Deserialize(cloudQueueMessage);
}
示例9: Receive
public async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken = default(CancellationToken))
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (Address == null)
{
throw new InvalidOperationException("This Amazon SQS transport does not have an input queue, hence it is not possible to reveive anything");
}
var client = GetClientFromTransactionContext(context);
var request = new ReceiveMessageRequest(_queueUrl)
{
MaxNumberOfMessages = 1,
WaitTimeSeconds = 1,
AttributeNames = new List<string>(new[] { "All" }),
MessageAttributeNames = new List<string>(new[] { "All" })
};
var response = await client.ReceiveMessageAsync(request, cancellationToken);
if (!response.Messages.Any()) return null;
var message = response.Messages.First();
var renewalTask = CreateRenewalTaskForMessage(message, client);
context.OnCompleted(async () =>
{
renewalTask.Dispose();
// if we get this far, we don't want to pass on the cancellation token
await client.DeleteMessageAsync(new DeleteMessageRequest(_queueUrl, message.ReceiptHandle));
});
context.OnAborted(() =>
{
renewalTask.Dispose();
client.ChangeMessageVisibility(_queueUrl, message.ReceiptHandle, 0);
});
if (MessageIsExpired(message))
{
// if the message is expired , we don't want to pass on the cancellation token
await client.DeleteMessageAsync(new DeleteMessageRequest(_queueUrl, message.ReceiptHandle));
return null;
}
renewalTask.Start();
var transportMessage = GetTransportMessage(message);
return transportMessage;
}
示例10: 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}");
}
}
示例11: Receive
public async Task<TransportMessage> Receive(ITransactionContext context)
{
if (Address == null)
{
throw new InvalidOperationException("This RabbitMQ transport does not have an input queue, hence it is not possible to reveive anything");
}
var model = GetModel(context);
var result = model.BasicGet(Address, false);
if (result == null) return null;
var deliveryTag = result.DeliveryTag;
context.OnCompleted(async () =>
{
model.BasicAck(deliveryTag, false);
});
context.OnAborted(() =>
{
model.BasicNack(deliveryTag, false, true);
});
var headers = result.BasicProperties.Headers
.ToDictionary(kvp => kvp.Key, kvp =>
{
var headerValue = kvp.Value;
if (headerValue is byte[])
{
var stringHeaderValue = HeaderValueEncoding.GetString((byte[])headerValue);
return stringHeaderValue;
}
return headerValue.ToString();
});
return new TransportMessage(headers, result.Body);
}
示例12: Receive
public async Task<TransportMessage> Receive(ITransactionContext context)
{
var model = GetModel(context);
var result = model.BasicGet(Address, false);
if (result == null) return null;
var deliveryTag = result.DeliveryTag;
context.OnCompleted(async () =>
{
model.BasicAck(deliveryTag, false);
});
context.OnAborted(() =>
{
model.BasicNack(deliveryTag, false, true);
});
var headers = result.BasicProperties.Headers
.ToDictionary(kvp => kvp.Key, kvp =>
{
var headerValue = kvp.Value;
if (headerValue is byte[])
{
var stringHeaderValue = HeaderValueEncoding.GetString((byte[])headerValue);
return stringHeaderValue;
}
return headerValue.ToString();
});
return new TransportMessage(headers, result.Body);
}