private async Task SendOutgoingMessages(ConcurrentQueue <AmazonOutgoingMessage> outgoingMessages, ITransactionContext context) { if (!outgoingMessages.Any()) { return; } var client = _amazonInternalSettings.CreateSqsClient(context); var messagesByDestination = outgoingMessages.GroupBy(m => m.DestinationAddress).ToList(); await Task.WhenAll(messagesByDestination.Select(async batch => { var entries = batch.Select(message => { var transportMessage = message.TransportMessage; var headers = transportMessage.Headers; var messageId = headers[Headers.MessageId]; var sqsMessage = new AmazonTransportMessage(transportMessage.Headers, StringHelper.GetBody(transportMessage.Body)); var entry = new SendMessageBatchRequestEntry(messageId, _amazonInternalSettings.MessageSerializer.Serialize(sqsMessage)); var delaySeconds = GetDelaySeconds(headers); if (delaySeconds != null) { entry.DelaySeconds = delaySeconds.Value; } return(entry); }).ToList(); var destinationUrl = _amazonSqsQueueContext.GetDestinationQueueUrlByName(batch.Key, context); foreach (var batchToSend in entries.Batch(10)) { var request = new SendMessageBatchRequest(destinationUrl, batchToSend); var response = await client.SendMessageBatchAsync(request); if (response.Failed.Count == 0) { continue; } var failed = response.Failed.Select(f => new AmazonSQSException($"Failed {f.Message} with Id={f.Id}, Code={f.Code}, SenderFault={f.SenderFault}")); throw new AggregateException(failed); } })); }
public async Task SendAsync(TransportMessage message, ITransactionContext context) { var snsClient = _amazonInternalSettings.CreateSnsClient(context); var sqsMessage = new AmazonTransportMessage(message.Headers, StringHelper.GetBody(message.Body)); var msg = _amazonInternalSettings.MessageSerializer.Serialize(sqsMessage); var pubRequest = new PublishRequest(_destinationAddress, msg); var messageAttributeValues = context.GetOrNull <IDictionary <string, MessageAttributeValue> >(SnsAttributeMapperOutBoundStep.SnsAttributeKey) ?? new Dictionary <string, MessageAttributeValue>(); foreach (var messageAttributeValue in messageAttributeValues) { pubRequest.MessageAttributes.Add(messageAttributeValue.Key, messageAttributeValue.Value); } var publishResponse = await snsClient.PublishAsync(pubRequest); if (publishResponse.HttpStatusCode != HttpStatusCode.OK) { throw new SnsRebusException($"Error publishing message to topic {_destinationAddress}.", publishResponse.CreateAmazonExceptionFromResponse()); } }