public bool Execute() { Console.WriteLine("Moving {0} messages from {1} to {2}", Count, SourceQueueName, DestinationQueueName); var client = AWSClientFactory.CreateAmazonSQSClient(_configuration.AWSAccessKey, _configuration.AWSSecretKey, RegionEndpoint.GetBySystemName(_configuration.Region)); var sourceQueue = new SqsQueueByName(SourceQueueName, client, JustSayingConstants.DEFAULT_HANDLER_RETRY_COUNT); var destinationQueue = new SqsQueueByName(DestinationQueueName, client, JustSayingConstants.DEFAULT_HANDLER_RETRY_COUNT); var messages = PopMessagesFromSourceQueue(sourceQueue); var receiptHandles = messages.ToDictionary(m => m.MessageId, m => m.ReceiptHandle); var sendResponse = destinationQueue.Client.SendMessageBatch(new SendMessageBatchRequest() { QueueUrl = destinationQueue.Url, Entries = messages.Select(x => new SendMessageBatchRequestEntry { Id = x.MessageId, MessageBody = x.Body }).ToList() }); var deleteResponse = sourceQueue.Client.DeleteMessageBatch(new DeleteMessageBatchRequest { QueueUrl = sourceQueue.Url, Entries = sendResponse.Successful.Select(x => new DeleteMessageBatchRequestEntry { Id = x.Id, ReceiptHandle = receiptHandles[x.Id] }).ToList() }); Console.WriteLine("Moved {0} messages from {1} to {2}", sendResponse.Successful.Count, SourceQueueName, DestinationQueueName); return true; }
[Then, Timeout(70000)] // ToDo: Sorry about this, but SQS is a little slow to verify against. Can be better I'm sure? ;) public async Task QueueIsCreated() { var queue = new SqsQueueByName(RegionEndpoint.EUWest1, QueueName, CreateMeABus.DefaultClientFactory().GetSqsClient(RegionEndpoint.EUWest1), 0); await Patiently.AssertThatAsync( queue.Exists, TimeSpan.FromSeconds(65)); }
private List<Message> PopMessagesFromSourceQueue(SqsQueueByName sourceQueue) { List<Message> messages = new List<Message>(); ReceiveMessageResponse receiveResponse; do { receiveResponse = sourceQueue.Client.ReceiveMessage(new ReceiveMessageRequest { QueueUrl = sourceQueue.Url, MaxNumberOfMessages = Count, }); messages.AddRange(receiveResponse.Messages); } while (messages.Count < Count && receiveResponse.Messages.Any()); return messages; }
public void HandlingManyMessages(int throttleMessageCount) { var locker = new object(); var awsQueueClient = AWSClientFactory.CreateAmazonSQSClient(RegionEndpoint.EUWest1); var q = new SqsQueueByName("throttle_test", awsQueueClient, 1); if (!q.Exists()) { q.Create(60 * 2); Thread.Sleep(TimeSpan.FromMinutes(1)); // wait 60 secs for queue creation to be guaranteed completed by aws. :( } Assert.True(q.Exists()); Console.WriteLine("{0} - Adding {1} messages to the queue.", DateTime.Now, throttleMessageCount); var entriesAdded = 0; // Add some messages do { var entries = new List<SendMessageBatchRequestEntry>(); for (var j = 0; j < 10; j++) { var batchEntry = new SendMessageBatchRequestEntry { MessageBody = "{\"Subject\":\"GenericMessage\", \"Message\": \"" + entriesAdded.ToString() + "\"}", Id = Guid.NewGuid().ToString() }; entries.Add(batchEntry); entriesAdded++; } awsQueueClient.SendMessageBatch(new SendMessageBatchRequest { QueueUrl = q.Url, Entries = entries }); } while (entriesAdded < throttleMessageCount); Console.WriteLine("{0} - Done adding messages.", DateTime.Now); var handleCount = 0; var serialisations = Substitute.For<IMessageSerialisationRegister>(); var monitor = Substitute.For<IMessageMonitor>(); var handler = Substitute.For<IHandler<GenericMessage>>(); handler.Handle(null).ReturnsForAnyArgs(true).AndDoes(x => {lock (locker) { Thread.Sleep(10);handleCount++; } }); var serialiser = Substitute.For<IMessageSerialiser<GenericMessage>>(); serialiser.Deserialise(string.Empty).ReturnsForAnyArgs(new GenericMessage()); serialisations.GetSerialiser(string.Empty).ReturnsForAnyArgs(serialiser); var listener = new SqsNotificationListener(q, serialisations, monitor); listener.AddMessageHandler(handler); listener.Listen(); var waitCount = 0; do { Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine("{0} - Handled {1} messages. Waiting for completion.", DateTime.Now, handleCount); waitCount++; } while (handleCount < throttleMessageCount && waitCount < 100); listener.StopListening(); Console.WriteLine("{0} - Handled {1} messages.", DateTime.Now, handleCount); Assert.AreEqual(throttleMessageCount, handleCount); }
public void QueueIsCreated() { var queue = new SqsQueueByName(QueueName, new AmazonSQSClient(RegionEndpoint.EUWest1), 0); Patiently.AssertThat(queue.Exists, TimeSpan.FromSeconds(65)); }