/// <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); }
/// <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); } } }
/// <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); }