示例#1
0
        /// <summary>
        /// gets the next message(s) to be processed
        /// </summary>
        /// <returns></returns>
        private async Task <List <SqsPayload> > DequeueNextAsync(CancellationToken cancellationToken, int messageCount)
        {
            List <SqsPayload>     returnValue           = new List <SqsPayload>();
            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest
            {
                QueueUrl            = _QueueUrl,
                MaxNumberOfMessages = messageCount,
                VisibilityTimeout   = QueueVisibilityTimeoutInSeconds,
                WaitTimeSeconds     = 20
            };
            ReceiveMessageResponse awsResp = await _AmazonSQSClient.ReceiveMessageAsync(receiveMessageRequest, cancellationToken);

            if (HttpStatusCode.OK == awsResp.HttpStatusCode && !cancellationToken.IsCancellationRequested)
            {
                foreach (Message responseMessage in awsResp.Messages)
                {
                    SqsPayload payload = new SqsPayload
                    {
                        RecieptHandle = responseMessage.ReceiptHandle,
                        MessageId     = responseMessage.MessageId,
                    };
                    if (typeof(T) == typeof(string))
                    {
                        payload.MessageData = responseMessage.Body as T;
                    }
                    else
                    {
                        payload.MessageData = responseMessage.Body.FromJson <T>();
                    }
                    returnValue.Add(payload);
                }
            }
            return(returnValue);
        }
示例#2
0
        /// <summary>
        /// calls the handler with a single entry
        /// </summary>
        /// <param name="queuePayload"></param>
        private void DispatchPayloadToCallBackHandler(SqsPayload queuePayload, Func <T, string, SqsQueueDispatcher <T>, bool> callBackHandler)
        {
            try
            {
                lock (_LockProxy)
                {
                    //add the reciept handle to the list of open handlers
                    _OpenHandles.Add(queuePayload.RecieptHandle);
                }
                bool deleteMessage = callBackHandler(queuePayload.MessageData, queuePayload.RecieptHandle, this);
                if (deleteMessage)
                {
                    //if the return is true, then it was handled so remove it
                    DeleteMessage(queuePayload.RecieptHandle);
                }
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (ThreadAbortException)
            {
                throw;
            }
            catch (Exception logThis)
            {
                if (null != _SysLogger)
                {
                    _SysLogger.LogError(logThis.ExceptionText());
                }
                if (null != _SysLogger)
                {
                    _SysLogger.LogError(logThis, string.Format("Error occurred in queue handler for {0}.", _QueueName));
                }

                System.Diagnostics.Trace.WriteLine(logThis.Message);
            }
            finally
            {
                lock (_LockProxy)
                {
                    //remove the recipet handler for the open handles list
                    _OpenHandles.Remove(queuePayload.RecieptHandle);
                }
            }
        }
示例#3
0
        /// <summary>
        /// gets the next message(s) to be processed
        /// </summary>
        /// <returns></returns>
        public List <SqsPayload> DequeueNext(int messageCount = 1)
        {
            if (messageCount < 0 || messageCount > 10)
            {
                throw new ArgumentOutOfRangeException("messageCount");
            }
            List <SqsPayload>     returnValue           = new List <SqsPayload>();
            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest
            {
                QueueUrl            = _QueueUrl,
                MaxNumberOfMessages = messageCount,
                VisibilityTimeout   = QueueVisibilityTimeoutInSeconds,
                WaitTimeSeconds     = 20
            };
            ReceiveMessageResponse awsResp = _AmazonSQSClient.ReceiveMessageAsync(receiveMessageRequest).Result;

            if (HttpStatusCode.OK == awsResp.HttpStatusCode)
            {
                foreach (Message responseMessage in awsResp.Messages)
                {
                    SqsPayload payload = new SqsPayload
                    {
                        RecieptHandle = responseMessage.ReceiptHandle,
                        MessageId     = responseMessage.MessageId,
                    };
                    if (typeof(T) == typeof(string))
                    {
                        payload.MessageData = responseMessage.Body as T;
                    }
                    else
                    {
                        payload.MessageData = responseMessage.Body.FromJson <T>();
                    }
                    returnValue.Add(payload);
                }
            }
            return(returnValue);
        }