diff --git a/Source/FikaAmazonAPI.SampleCode/CustomMessageReceiver.cs b/Source/FikaAmazonAPI.SampleCode/CustomMessageReceiver.cs index 568be1a1..ce093140 100644 --- a/Source/FikaAmazonAPI.SampleCode/CustomMessageReceiver.cs +++ b/Source/FikaAmazonAPI.SampleCode/CustomMessageReceiver.cs @@ -17,4 +17,21 @@ public void NewMessageRevicedTriger(NotificationMessageResponce message) //Your Code here } } + + public class CustomMessageRecieverWithResult : IMessageReceiverWithResult + { + public void ErrorCatch(Exception ex) + { + //Your code here + } + + public bool NewMessageRevicedTriger(NotificationMessageResponce message) + { + Console.Write("."); + //Your Code here + + // Return true to acknowledge and delete the message from queue, false to leave it in the queue. + return false; + } + } } diff --git a/Source/FikaAmazonAPI/Parameter/Notification/IMessageReceiverWithResult.cs b/Source/FikaAmazonAPI/Parameter/Notification/IMessageReceiverWithResult.cs new file mode 100644 index 00000000..8a41e086 --- /dev/null +++ b/Source/FikaAmazonAPI/Parameter/Notification/IMessageReceiverWithResult.cs @@ -0,0 +1,11 @@ +using FikaAmazonAPI.NotificationMessages; +using System; + +namespace FikaAmazonAPI.Parameter.Notification +{ + public interface IMessageReceiverWithResult + { + bool NewMessageRevicedTriger(NotificationMessageResponce message); + void ErrorCatch(Exception ex); + } +} diff --git a/Source/FikaAmazonAPI/Services/NotificationService.cs b/Source/FikaAmazonAPI/Services/NotificationService.cs index 5c515717..31986978 100644 --- a/Source/FikaAmazonAPI/Services/NotificationService.cs +++ b/Source/FikaAmazonAPI/Services/NotificationService.cs @@ -11,6 +11,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using System.Linq; using static FikaAmazonAPI.AmazonSpApiSDK.Models.Token.CacheTokenData; using static FikaAmazonAPI.Utils.Constants; @@ -117,7 +118,15 @@ public async Task DeleteSubscriptionByIdAsync(NotificationType notificatio public void StartReceivingNotificationMessages(ParameterMessageReceiver param, IMessageReceiver messageReceiver, bool isDeleteNotificationAfterRead = true) => Task.Run(() => StartReceivingNotificationMessagesAsync(param, messageReceiver, isDeleteNotificationAfterRead)).ConfigureAwait(false).GetAwaiter().GetResult(); - public async Task StartReceivingNotificationMessagesAsync(ParameterMessageReceiver param, IMessageReceiver messageReceiver, bool isDeleteNotificationAfterRead = true, CancellationToken cancellationToken = default) + public void StartReceivingNotificationMessages(ParameterMessageReceiver param, IMessageReceiverWithResult messageReceiver, bool isDeleteNotificationAfterRead = false) => + Task.Run(() => StartReceivingNotificationMessagesAsync(param, messageReceiver, isDeleteNotificationAfterRead)).ConfigureAwait(false).GetAwaiter().GetResult(); + + public Task StartReceivingNotificationMessagesAsync(ParameterMessageReceiver param, IMessageReceiver messageReceiver, bool isDeleteNotificationAfterRead = true, CancellationToken cancellationToken = default) + { + return StartReceivingNotificationMessagesAsync(param, new MessageReceiverAdapter(messageReceiver), isDeleteNotificationAfterRead, cancellationToken); + } + + public async Task StartReceivingNotificationMessagesAsync(ParameterMessageReceiver param, IMessageReceiverWithResult messageReceiver, bool isDeleteNotificationAfterRead = false, CancellationToken cancellationToken = default) { var awsAccessKeyId = param.awsAccessKeyId; var awsSecretAccessKey = param.awsSecretAccessKey; @@ -157,22 +166,23 @@ public async Task StartReceivingNotificationMessagesAsync(ParameterMessageReceiv } } - private async Task ProcessAnyOfferChangedMessage(Message msg, IMessageReceiver messageReceiver, AmazonSQSClient amazonSQSClient, string SQS_URL, bool isDeleteNotificationAfterRead = true, CancellationToken cancellationToken = default) + private async Task ProcessAnyOfferChangedMessage(Message msg, IMessageReceiverWithResult messageReceiver, AmazonSQSClient amazonSQSClient, string SQS_URL, bool isDeleteNotificationAfterRead = true, CancellationToken cancellationToken = default) { + var deleteMessage = isDeleteNotificationAfterRead; try { var data = DeserializeNotification(msg); - messageReceiver.NewMessageRevicedTriger(data); + deleteMessage = messageReceiver.NewMessageRevicedTriger(data) || isDeleteNotificationAfterRead; - if (isDeleteNotificationAfterRead) + if (deleteMessage) await DeleteMessageFromQueueAsync(amazonSQSClient, SQS_URL, msg.ReceiptHandle, cancellationToken); } catch (Exception ex) { messageReceiver.ErrorCatch(ex); - if (isDeleteNotificationAfterRead) + if (deleteMessage) await DeleteMessageFromQueueAsync(amazonSQSClient, SQS_URL, msg.ReceiptHandle, cancellationToken); } } @@ -194,5 +204,25 @@ private NotificationMessageResponce DeserializeNotification(Message message) return notification; } + private class MessageReceiverAdapter : IMessageReceiverWithResult + { + private readonly IMessageReceiver _receiver; + + public MessageReceiverAdapter(IMessageReceiver receiver) + { + _receiver = receiver; + } + + public void ErrorCatch(Exception ex) + { + _receiver.ErrorCatch(ex); + } + + public bool NewMessageRevicedTriger(NotificationMessageResponce message) + { + _receiver.NewMessageRevicedTriger(message); + return false; + } + } } }