public TransportMessage SendRawAndReceiveMessage(string rawMessageString)
 {
     return(SendAndReceiveCore(() =>
     {
         SqsClient.SendMessage(QueueUrlCache.GetQueueUrl(Address), rawMessageString);
     }));
 }
Exemple #2
0
 public Application(ILoggerFactory loggerFactory, IdentityClient identityClient, SqsClient sqsClient, IServiceProvider serviceProvider)
 {
     _logger          = loggerFactory.CreateLogger(nameof(Application));
     _identityClient  = identityClient;
     _sqsClient       = sqsClient;
     _serviceProvider = serviceProvider;
 }
        public async Task Init(Func <MessageContext, Task> onMessage, Func <ErrorContext, Task <ErrorHandleResult> > onError, CriticalError criticalError, PushSettings settings)
        {
            _queueUrl = SqsQueueUrlCache.GetQueueUrl(SqsQueueNameHelper.GetSqsQueueName(settings.InputQueue, ConnectionConfiguration));

            if (settings.PurgeOnStartup)
            {
                // SQS only allows purging a queue once every 60 seconds or so.
                // If you try to purge a queue twice in relatively quick succession,
                // PurgeQueueInProgressException will be thrown.
                // This will happen if you are trying to start an endpoint twice or more
                // in that time.
                try
                {
                    await SqsClient.PurgeQueueAsync(_queueUrl).ConfigureAwait(false);
                }
                catch (PurgeQueueInProgressException ex)
                {
                    Logger.Warn("Multiple queue purges within 60 seconds are not permitted by SQS.", ex);
                }
                catch (Exception ex)
                {
                    Logger.Error("Exception thrown from PurgeQueue.", ex);
                    throw;
                }
            }

            _onMessage = onMessage;
            _onError   = onError;
        }
Exemple #4
0
        /// <summary>
        /// Gets a message from an SQS queue and if successful, deletes the message from the queue.
        /// Safe method for multiple concurrent consumers of a single SQS because the initial message read makes the message unavailable to other callers.
        /// </summary>
        /// <param name="QueueUrl">The SQS queue URL</param>
        /// <param name="bForceNoDelete">Debug option. Skips the message delete when testing reading messages from a live queue</param>
        /// <returns>A dequeued SQS message or null if it fails.</returns>
        public Message SQSDequeueMessage(string QueueUrl, bool bForceNoDelete)
        {
            if (!IsSQSValid)
            {
                return(null);
            }

            ReceiveMessageRequest ReceiveRequest = new ReceiveMessageRequest
            {
                QueueUrl            = QueueUrl,
                MaxNumberOfMessages = 1
            };

            ReceiveMessageResponse ReceiveResponse = SqsClient.ReceiveMessage(ReceiveRequest);

            if (ReceiveResponse.Messages.Count == 1)
            {
                Message Message = ReceiveResponse.Messages[0];

                if (Message != null && (bForceNoDelete || DeleteRecordSQS(QueueUrl, Message)))
                {
                    return(Message);
                }
            }

            return(null);
        }
Exemple #5
0
        private bool DequeueRecordSQS(out string OutRecordString)
        {
            OutRecordString = string.Empty;

            try
            {
                var ReceiveRequest = new ReceiveMessageRequest
                {
                    QueueUrl            = Config.Default.AWSSQSQueueUrl,
                    MaxNumberOfMessages = 1
                };

                var ReceiveResponse = SqsClient.ReceiveMessage(ReceiveRequest);

                if (ReceiveResponse.Messages.Count == 1)
                {
                    var Message = ReceiveResponse.Messages[0];

                    if (Message != null && TryDeleteRecordSQS(Message))
                    {
                        OutRecordString = Message.Body;
                        return(true);
                    }
                }
            }
            catch (Exception Ex)
            {
                CrashReporterProcessServicer.WriteException("DequeueRecordSQS: " + Ex.ToString());
            }
            return(false);
        }
Exemple #6
0
        public override void Dispose()
        {
            SqsClient.Dispose();
            S3Client.Dispose();

            base.Dispose();
        }
Exemple #7
0
        private void SendMessage(string message, SendOptions sendOptions)
        {
            var delayDeliveryBy = TimeSpan.MaxValue;

            if (sendOptions.DelayDeliveryWith.HasValue)
            {
                delayDeliveryBy = sendOptions.DelayDeliveryWith.Value;
            }
            else
            {
                if (sendOptions.DeliverAt.HasValue)
                {
                    delayDeliveryBy = sendOptions.DeliverAt.Value - DateTime.UtcNow;
                }
            }

            var sendMessageRequest = new SendMessageRequest(QueueUrlCache.GetQueueUrl(sendOptions.Destination), message);

            // There should be no need to check if the delay time is greater than the maximum allowed
            // by SQS (15 minutes); the call to AWS will fail with an appropriate exception if the limit is exceeded.
            if (delayDeliveryBy != TimeSpan.MaxValue)
            {
                sendMessageRequest.DelaySeconds = Math.Max(0, (int)delayDeliveryBy.TotalSeconds);
            }

            SqsClient.SendMessage(sendMessageRequest);
        }
Exemple #8
0
        public void Init()
        {
            var accountId = Environment.GetEnvironmentVariable("SQS_ACCOUNT_ID");
            if(string.IsNullOrEmpty(accountId)) {
                accountId = "accountid";
            }
            var publicKey = Environment.GetEnvironmentVariable("AWS_ACCESS_KEY_ID");
            if(string.IsNullOrEmpty(publicKey)) {
                publicKey = "publickey";
            }
            var privateKey = Environment.GetEnvironmentVariable("AWS_SECRET_ACCESS_KEY");
            if(string.IsNullOrEmpty("privatekey")) {
                privateKey = "privatekey";
            }
            _client = new SqsClient(SqsClientConfig.From(new XDoc("sqs-config")
                .Elem("endpoint", "default")
                .Elem("accountid", accountId)
                .Elem("publickey", publicKey)
                .Elem("privatekey", privateKey)));
            TEST_QUEUE = new SqsQueueName("steveb-events");

            // purge the queue
            while(true) {
                var messages = _client.ReceiveMessages(TEST_QUEUE, 1.Seconds(), SqsUtils.MAX_NUMBER_OF_MESSAGES_TO_FETCH);
                if(messages.None()) {
                    break;
                }
                _client.DeleteMessages(TEST_QUEUE, messages);
            }
        }
Exemple #9
0
        public async Task It_Dispatches_A_Message()
        {
            // Arrange.
            var expiry  = DateTime.Now.AddDays(1);
            var message = Message.WithContent("abc").WhichExpiresAt(expiry);

            // Act.
            var response = await QueueManager.Dispatch(message);

             
            // Assert.
            Assert.NotEqual(Guid.Empty, response.MessageId);

            var receivedMessage = await SqsClient.ReceiveMessageAsync(new ReceiveMessageRequest
            {
                QueueUrl            = QueueUrl,
                WaitTimeSeconds     = 1,
                MaxNumberOfMessages = 1
            });

            Assert.NotEmpty(receivedMessage.Messages);

            var deserialisedMessage = JsonSerializer.Deserialize <ReceivedMessage>(receivedMessage.Messages.First().Body);

            Assert.Equal(response.MessageId, deserialisedMessage.Id);
            Assert.Equal("default", deserialisedMessage.Queue);
            Assert.Equal("abc", deserialisedMessage.Content);
            Assert.Equal(expiry, deserialisedMessage.Expiry);
        }
        private async Task SendMessage(string message, string destination, List <DeliveryConstraint> constraints)
        {
            var delayWithConstraint = constraints.OfType <DelayDeliveryWith>().SingleOrDefault();
            var deliverAtConstraint = constraints.OfType <DoNotDeliverBefore>().SingleOrDefault();

            var delayDeliveryBy = TimeSpan.MaxValue;

            if (delayWithConstraint != null)
            {
                delayDeliveryBy = delayWithConstraint.Delay;
            }
            else
            {
                if (deliverAtConstraint != null)
                {
                    delayDeliveryBy = deliverAtConstraint.At - DateTime.UtcNow;
                }
            }

            var sendMessageRequest = new SendMessageRequest(
                SqsQueueUrlCache.GetQueueUrl(
                    SqsQueueNameHelper.GetSqsQueueName(destination, ConnectionConfiguration)),
                message);

            // There should be no need to check if the delay time is greater than the maximum allowed
            // by SQS (15 minutes); the call to AWS will fail with an appropriate exception if the limit is exceeded.
            if (delayDeliveryBy != TimeSpan.MaxValue)
            {
                sendMessageRequest.DelaySeconds = Math.Max(0, (int)delayDeliveryBy.TotalSeconds);
            }

            await SqsClient.SendMessageAsync(sendMessageRequest).ConfigureAwait(false);
        }
 /// <summary>
 /// Send a message to the specified SQS queue. The Lambda function requires <c>sqs:SendMessage</c> permission
 /// on the specified SQS queue.
 /// </summary>
 /// <param name="deadLetterQueueUrl">The SQS queue URL.</param>
 /// <param name="message">The message to send.</param>
 /// <param name="messageAttributes">Optional attributes for the message.</param>
 /// <param name="cancellationToken">The token to monitor for cancellation requests.</param>
 /// <returns>The task object representing the asynchronous operation.</returns>
 public virtual Task SendMessageToQueueAsync(string deadLetterQueueUrl, string message, IEnumerable <KeyValuePair <string, string> >?messageAttributes, CancellationToken cancellationToken)
 => SqsClient.SendMessageAsync(new SendMessageRequest {
     QueueUrl          = deadLetterQueueUrl,
     MessageBody       = message,
     MessageAttributes = messageAttributes?.ToDictionary(kv => kv.Key, kv => new MessageAttributeValue {
         DataType    = "String",
         StringValue = kv.Value
     }) ?? new Dictionary <string, MessageAttributeValue>()
 }, cancellationToken);
Exemple #12
0
        public void Publish(T message)
        {
            message.Require("message");

            SqsClient.SendMessage(new SendMessageRequest
            {
                QueueUrl    = QueueUrl,
                MessageBody = Serializer.Serialize(message)
            });
        }
Exemple #13
0
        public bool ChangeVisibility(ChangeMessageVisibilityRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            var response = SqsClient.ChangeMessageVisibility(request);

            return(response != null);
        }
Exemple #14
0
        public bool Send(SendMessageRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            var response = SqsClient.SendMessage(request);

            return(response != null);
        }
Exemple #15
0
        public bool Delete(DeleteMessageRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            var response = SqsClient.DeleteMessage(request);

            return(response != null);
        }
Exemple #16
0
        public BnetClient(IOptions <Config> config, S3Client s3Client, SqsClient sqsClient, ILoggerFactory loggerFactory, IHub sentry, IServiceProvider serviceProvider)
        {
            _s3Client            = s3Client;
            _sqsClient           = sqsClient;
            _logger              = loggerFactory.CreateLogger(nameof(BnetClient));
            _sentry              = sentry;
            _serviceProvider     = serviceProvider;
            _puppeteerRemoteHost = config.Value.PuppeteerRemoteHost;

            this.ConnectOrLaunch().Wait();
        }
        public void CreateQueue()
        {
            Creator.CreateQueueIfNecessary(Address, "");

            try
            {
                SqsClient.PurgeQueue(QueueUrlCache.GetQueueUrl(Address));
            }
            catch (PurgeQueueInProgressException)
            {
            }
        }
Exemple #18
0
        private bool DeleteRecordSQS(string QueueUrl, Message InMessage)
        {
            DeleteMessageRequest DeleteRequest = new DeleteMessageRequest
            {
                QueueUrl      = QueueUrl,
                ReceiptHandle = InMessage.ReceiptHandle
            };

            var DeleteResponse = SqsClient.DeleteMessage(DeleteRequest);

            return(DeleteResponse.HttpStatusCode == HttpStatusCode.OK);
        }
Exemple #19
0
 private static void EnsureQueue(IServiceHandler handler)
 {
     if (!_registeredHandlerUrls.ContainsKey(handler.QueueName))
     {
         var createQueueRequest = new CreateQueueRequest();
         createQueueRequest.QueueName = handler.QueueName;
         var createQueueResponse = SqsClient.CreateQueue(createQueueRequest);
         var queueUrl            = createQueueResponse.CreateQueueResult.QueueUrl;
         _registeredHandlerUrls[handler.QueueName] = queueUrl;
     }
     handler.QueueUrl = _registeredHandlerUrls[handler.QueueName];
 }
Exemple #20
0
        public async Task <SendMessageResponse> SendMessage(string message)
        {
            var response = await SystemsManagementClient.GetParameterAsync(new GetParameterRequest()
            {
                Name = "OrdersQueueName"
            });

            return(await SqsClient.SendMessageAsync(new SendMessageRequest()
            {
                MessageBody = message,
                QueueUrl = response.Parameter.Value
            }));
        }
        public string GetQueueUrl(Address address)
        {
            string result;
            var    addressKey = address.ToString();

            if (!_cache.TryGetValue(addressKey, out result))
            {
                var getQueueUrlResponse = SqsClient.GetQueueUrl(address.ToSqsQueueName(ConnectionConfiguration));
                result = getQueueUrlResponse.QueueUrl;
                _cache.AddOrUpdate(addressKey, result, (x, y) => result);
            }
            return(result);
        }
        public void Dispose()
        {
            DequeueStrategy.Stop();

            if (S3Client != null)
            {
                S3Client.Dispose();
            }
            if (SqsClient != null)
            {
                SqsClient.Dispose();
            }
        }
Exemple #23
0
        public Message Receive(ReceiveMessageRequest request)
        {
            if (request == null)
            {
                return(null);
            }

            request.MaxNumberOfMessages = 1;

            var response = SqsClient.ReceiveMessage(request);

            return(response?.Messages.SingleOrDefault());
        }
Exemple #24
0
 /// <summary>
 /// Dispose of this object
 /// </summary>
 /// <param name="disposing">Dispose of managed resources?</param>
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         if (SqsClient != null)
         {
             SqsClient.Dispose();
         }
         if (S3Client != null)
         {
             S3Client.Dispose();
         }
     }
 }
Exemple #25
0
 protected override void Given()
 {
     SqsClient.ReceiveMessageAsync(Arg.Any <ReceiveMessageRequest>(), Arg.Any <CancellationToken>())
     .Returns(_ =>
     {
         Interlocked.Increment(ref _callCount);
         var messages = new List <Message> {
             new TestMessage()
         };
         return(new ReceiveMessageResponse {
             Messages = messages
         });
     });
 }
Exemple #26
0
        public IMessageContext <T> Receive(TimeSpan?timeout = null)
        {
            var receiveResponse = SqsClient.ReceiveMessage(new ReceiveMessageRequest {
                QueueUrl = QueueUrl
            });
            var message = receiveResponse.Messages.FirstOrDefault();

            if (message == null)
            {
                return(null);
            }

            return(new AwsSqsMessageContext <T>(this, Serializer.Deserialize(message.Body), message.ReceiptHandle));
        }
        public async Task Setup()
        {
            _sqsClient = SqsClient.GetAmazonSqsClient();

            await _sqsClient.CreateQueueAsync(new CreateQueueRequest(_testReceiveQueueName));

            GetQueueUrlResponse getQueueUrlResponse = await _sqsClient.GetQueueUrlAsync(_testReceiveQueueName);

            _testQueueUrl = getQueueUrlResponse.QueueUrl;

            for (var i = 0; i < 10; i++)
            {
                await _sqsClient.SendMessageAsync(new SendMessageRequest(_testQueueUrl, $"message body {i}"));
            }
        }
        public Message Receive(ReceiveMessageRequest request)
        {
            if (request == null)
            {
                return(null);
            }

            if (receiveBuffer.Count > 0 && receiveBuffer.TryDequeue(out var toReturn))
            {
                return(toReturn);
            }

            request.MaxNumberOfMessages = Math.Min(SqsQueueDefinition.MaxBatchReceiveItems, Math.Max(request.MaxNumberOfMessages, 1));

            var response = SqsClient.ReceiveMessage(request);

            return(BufferResponse(response));
        }
Exemple #29
0
        /// <summary>
        /// Get the number of items in an SQS queue
        /// </summary>
        /// <param name="QueueUrl">The SQS queue URL</param>
        /// <returns>Number of messages in the queue. Returns zero in the event of an error.</returns>
        public int GetSQSQueueCount(string QueueUrl)
        {
            if (!IsSQSValid)
            {
                return(0);
            }

            GetQueueAttributesRequest AttribRequest = new GetQueueAttributesRequest
            {
                QueueUrl       = QueueUrl,
                AttributeNames = new List <string>
                {
                    "ApproximateNumberOfMessages"
                }
            };

            GetQueueAttributesResponse AttribResponse = SqsClient.GetQueueAttributes(AttribRequest);

            return(AttribResponse.ApproximateNumberOfMessages);
        }
Exemple #30
0
        private bool DeleteEnqueued(int minBufferCount, bool forceOne = false)
        {
            var deletedAtSqs = false;

            minBufferCount = Math.Min(SqsQueueDefinition.MaxBatchDeleteItems, Math.Max(minBufferCount, 1));

            try
            {
                while (forceOne || deleteBuffer.Count >= minBufferCount)
                {
                    forceOne = false;

                    var entries = EntriesToDelete(SqsQueueDefinition.MaxBatchDeleteItems).ToList();

                    if (entries.Count <= 0)
                    {
                        break;
                    }

                    deletedAtSqs = true;

                    var response = SqsClient.DeleteMessageBatch(new DeleteMessageBatchRequest
                    {
                        QueueUrl = queueDefinition.QueueUrl,
                        Entries  = entries
                    });

                    if (response.Failed != null && response.Failed.Count > 0)
                    {
                        response.Failed.Each(f => HandleError(f.ToException()));
                    }
                }
            }
            catch (Exception ex)
            {
                HandleError(ex);
            }

            return(deletedAtSqs);
        }
Exemple #31
0
        private bool CvEnqueued(int minBufferCount, bool forceOne = false)
        {
            var cvAtAws = false;

            minBufferCount = Math.Min(SqsQueueDefinition.MaxBatchCvItems, Math.Max(minBufferCount, 1));

            try
            {
                while (forceOne || cvBuffer.Count >= minBufferCount)
                {
                    forceOne = false;

                    var entries = EntriesToCv(SqsQueueDefinition.MaxBatchCvItems).ToList();

                    if (entries.Count <= 0)
                    {
                        break;
                    }

                    cvAtAws = true;

                    var response = SqsClient.ChangeMessageVisibilityBatch(new ChangeMessageVisibilityBatchRequest
                    {
                        QueueUrl = queueDefinition.QueueUrl,
                        Entries  = entries
                    });

                    if (response.Failed != null && response.Failed.Count > 0)
                    {
                        response.Failed.Each(f => HandleError(f.ToException()));
                    }
                }
            }
            catch (Exception ex)
            {
                HandleError(ex);
            }

            return(cvAtAws);
        }
Exemple #32
0
 public void Teardown()
 {
     _client = null;
 }