Ejemplo n.º 1
0
        private SqsQueueDefinition CreateQueue(SqsQueueName queueName, int?visibilityTimeoutSeconds = null,
                                               int?receiveWaitTimeSeconds     = null, bool?disasbleBuffering = null,
                                               SqsRedrivePolicy redrivePolicy = null)
        {
            SqsQueueDefinition queueDefinition = null;

            var request = new CreateQueueRequest
            {
                QueueName  = queueName.AwsQueueName,
                Attributes = new Dictionary <string, string>
                {
                    {
                        QueueAttributeName.ReceiveMessageWaitTimeSeconds,
                        TimeSpan.FromSeconds(receiveWaitTimeSeconds ?? DefaultReceiveWaitTime)
                        .TotalSeconds
                        .ToString(CultureInfo.InvariantCulture)
                    },
                    {
                        QueueAttributeName.VisibilityTimeout,
                        TimeSpan.FromSeconds(visibilityTimeoutSeconds ?? DefaultVisibilityTimeout)
                        .TotalSeconds
                        .ToString(CultureInfo.InvariantCulture)
                    },
                    {
                        QueueAttributeName.MessageRetentionPeriod,
                        (QueueNames.IsTempQueue(queueName.QueueName)
                            ? SqsQueueDefinition.DefaultTempQueueRetentionSeconds
                            : SqsQueueDefinition.DefaultPermanentQueueRetentionSeconds).ToString(CultureInfo.InvariantCulture)
                    }
                }
            };

            if (redrivePolicy != null)
            {
                var json = redrivePolicy.ToJson();
                request.Attributes.Add(QueueAttributeName.RedrivePolicy, json);
            }

            try
            {
                var createResponse = SqsClient.CreateQueue(request);

                // Note - must go fetch the attributes from the server after creation, as the request attributes do not include
                // anything assigned by the server (i.e. the ARN, etc.).
                queueDefinition = GetQueueDefinition(queueName, createResponse.QueueUrl);

                queueDefinition.DisableBuffering = disasbleBuffering ?? DisableBuffering;

                queueNameMap[queueDefinition.QueueName] = queueDefinition;
            }
            catch (QueueNameExistsException)
            {   // Queue exists with different attributes, instead of creating, alter those attributes to match what was requested
                queueDefinition = UpdateQueue(queueName, request.ToSetAttributesRequest(null), disasbleBuffering);
            }

            return(queueDefinition);
        }
Ejemplo n.º 2
0
        public void Can_determine_TempQueue_with_Custom_QueuePrefix()
        {
            QueueNames.SetQueuePrefix("site1.");

            var tmpName = QueueNames.GetTempQueueName();

            Assert.That(QueueNames.IsTempQueue(tmpName), Is.True);

            QueueNames.SetQueuePrefix("");
        }
Ejemplo n.º 3
0
        public void Can_determine_TempQueue_with_Custom_QueueNameFm()
        {
            QueueNames.ResolveQueueNameFn = (typeName, suffix) =>
                                            "SITE.{0}{1}".Fmt(typeName, suffix.ToUpper());

            var tmpName = QueueNames.GetTempQueueName();

            Assert.That(QueueNames.IsTempQueue(tmpName), Is.True);

            QueueNames.ResolveQueueNameFn = QueueNames.ResolveQueueName;
        }
Ejemplo n.º 4
0
        public static void RegisterQueue(this IModel channel, string queueName)
        {
            var args = new Dictionary <string, object> {
                { "x-dead-letter-exchange", QueueNames.ExchangeDlq },
                { "x-dead-letter-routing-key", queueName.Replace(".inq", ".dlq").Replace(".priorityq", ".dlq") },
            };

            if (!QueueNames.IsTempQueue(queueName)) //Already declared in GetTempQueueName()
            {
                channel.QueueDeclare(queueName, durable: true, exclusive: false, autoDelete: false, arguments: args);
            }

            channel.QueueBind(queueName, QueueNames.Exchange, routingKey: queueName);
        }
Ejemplo n.º 5
0
        public int RemoveEmptyTemporaryQueues(long createdBefore)
        {
            var queuesRemoved = 0;

            var localTempQueueUrlMap = new Dictionary <string, QueueNameUrlMap>();

            // First, check any locally available
            queueNameMap.Where(kvp => QueueNames.IsTempQueue(kvp.Key))
            .Where(kvp => kvp.Value.CreatedTimestamp <= createdBefore)
            .Each(kvp => localTempQueueUrlMap.Add(kvp.Value.QueueUrl,
                                                  new QueueNameUrlMap {
                QueueUrl  = kvp.Value.QueueUrl,
                QueueName = kvp.Value.QueueName
            }));

            // Refresh the local info for each of the potentials, then if they are empty and expired, remove
            foreach (var qNameUrl in localTempQueueUrlMap.Values)
            {
                var qd = GetQueueDefinition(qNameUrl.QueueName, qNameUrl.QueueUrl);

                if (qd.CreatedTimestamp > createdBefore || qd.ApproximateNumberOfMessages > 0)
                {
                    continue;
                }

                DeleteQueue(qd.SqsQueueName, qd.QueueUrl);
                queuesRemoved++;
            }

            var queues = SqsClient.ListQueues(new ListQueuesRequest
            {
                QueueNamePrefix = QueueNames.TempMqPrefix.ToValidQueueName()
            });

            if (queues == null || queues.QueueUrls == null || queues.QueueUrls.Count <= 0)
            {
                return(queuesRemoved);
            }

            foreach (var queueUrl in queues.QueueUrls)
            {
                // Already deleted above, or left purposely
                if (localTempQueueUrlMap.ContainsKey(queueUrl))
                {
                    continue;
                }

                var response = SqsClient.GetQueueAttributes(new GetQueueAttributesRequest
                {
                    QueueUrl       = queueUrl,
                    AttributeNames = new List <string>
                    {
                        QueueAttributeName.CreatedTimestamp,
                        QueueAttributeName.ApproximateNumberOfMessages
                    }
                });

                if (response == null || response.CreatedTimestamp.ToUnixTime() > createdBefore ||
                    response.ApproximateNumberOfMessages > 0)
                {
                    continue;
                }

                SqsClient.DeleteQueue(new DeleteQueueRequest {
                    QueueUrl = queueUrl
                });
                queuesRemoved++;
            }

            return(queuesRemoved);
        }
Ejemplo n.º 6
0
        public void Can_determine_TempQueue()
        {
            var tmpName = QueueNames.GetTempQueueName();

            Assert.That(QueueNames.IsTempQueue(tmpName), Is.True);
        }