public static async Task Run(TimerInfo getScheduledReadEnergyEarthMessagesTimer, ICollector <string> errormessage, TraceWriter log)
        {
            if (getScheduledReadEnergyEarthMessagesTimer.IsPastDue)
            {
                log.Verbose("Timer is running late!", "JE.RMS.Services.ScheduledReadEnergyEarthMessagesFromQueue");
            }

            try
            {
                var connectionString = ConfigurationManager.AppSettings["MyServiceBusReader"].ToString();

                SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString, "fulfillmentrequest", "EnergyEarthSubscription");

                int batchSize            = Convert.ToInt32(ConfigurationManager.AppSettings["ReadEnergyEarthMessageBatchSize"].ToString());
                var brokeredMessagesList = client.ReceiveBatch(1);

                List <Guid> messageLockTokenList = new List <System.Guid>();

                if (brokeredMessagesList.Count() > 0)
                {
                    foreach (BrokeredMessage message in brokeredMessagesList)
                    {
                        var raw = message.GetBody <string>();
                        var RewardFulfillmentRequestList = JsonConvert.DeserializeObject <RewardFulfillmentRequestList>(raw);

                        using (HttpClient httpClient = new HttpClient())
                        {
                            //Add Basic Authentication header
                            httpClient.BaseAddress = new Uri(ConfigurationManager.AppSettings["ProcessFulfillmentUrl"].ToString());

                            //log.Verbose($"Calling Update point status API, UserId : {CustomerUniqueId}, with Status : {PointStatus.Status}", "JE.RMS.Services.ProcessFulfillmentForEnergyEarth");
                            var response = await httpClient.PostAsJsonAsync(string.Empty, RewardFulfillmentRequestList);

                            if (response.IsSuccessStatusCode)
                            {
                                log.Verbose($"Success : Process fulfillment for EE", "JE.RMS.Services.ScheduledReadEnergyEarthMessagesFromQueue");
                            }
                            else
                            {
                                log.Error($"Error : Process fulfillment for EE", null, "JE.RMS.Services.ScheduledReadEnergyEarthMessagesFromQueue");
                            }
                        }
                        messageLockTokenList.Add(message.LockToken);
                    }

                    client.CompleteBatch(messageLockTokenList);
                    log.Verbose($"Completed : Process fulfillment for EE batch", "JE.RMS.Services.ScheduledReadEnergyEarthMessagesFromQueue");
                }
            }
            catch (Exception ex)
            {
                log.Error("Something went wrong while ScheduledReadEnergyEarthMessagesFromQueue", ex, "JE.RMS.Services.ScheduledReadEnergyEarthMessagesFromQueue");
                errormessage.Add(JsonConvert.SerializeObject(ex).ToString());
            }
        }
Пример #2
0
        public void ProcessSubscription(SubscriptionClient subscriptionClient, TopicClient destinationTopicClient)
        {
            _activityLogger.Log($"[{subscriptionClient.TopicPath}].[{subscriptionClient.Name}] - Processing subscription");

            var totalMessagesForwarded = 0;

            var messagesRemaining = true;

            while (messagesRemaining)
            {
                // get messages in source subscription
                var messages = subscriptionClient.ReceiveBatch(_messagesToHandle, _serverWaitTime);

                var messageCount = messages.Count();
                if (messageCount > 0)
                {
                    _activityLogger.Log($"Batch of {messageCount} message(s) received for processing", 1);

                    var messagesForwarded = 0;

                    foreach (var message in messages)
                    {
                        if (!_forwardedMessageIds.Contains(message.MessageId)) // ignore duplicate messages, which have already been forwarded
                        {
                            // log message
                            _messageLogger?.Log($"Subscription: [{subscriptionClient.TopicPath}].[{subscriptionClient.Name}]\n" +
                                                $"{message.GetSingleLineContent()}\n");

                            // send messages to destination topic
                            destinationTopicClient.Send(message.Clone());

                            _forwardedMessageIds.Add(message.MessageId);

                            messagesForwarded++;
                            totalMessagesForwarded++;
                        }

                        message.Complete();
                    }

                    _activityLogger.Log($"Processing complete: {messagesForwarded} message(s) forwarded " +
                                        $"({messageCount - messagesForwarded} duplicate(s) from other subscriptions)", 1);
                }
                else
                {
                    messagesRemaining = false;
                    _activityLogger.Log($"No {(totalMessagesForwarded > 0 ? "more " : "")}messages to process", 1);
                }
            }

            _activityLogger.Log($"[{subscriptionClient.TopicPath}].[{subscriptionClient.Name}] - Completed processing subscription - {totalMessagesForwarded} message(s) forwarded");
        }
Пример #3
0
        protected virtual void StartProcessing <T>(SubscriptionClient subscriptionClient, Action <IEnumerable <T> > messagesReceived)
            where T : SubscriptionMessage
        {
            log.Info("Starting processing");

            while (true)
            {
                log.Info($"Waiting for message batch.  BatchSize = {this.BatchSize}");
                var messages = subscriptionClient.ReceiveBatch(this.BatchSize);

                var brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray();

                log.Info($"Received {brokeredMessages.Count()} messages");
                this.ProcessMessages(subscriptionClient, messagesReceived, brokeredMessages);
            }
        }
Пример #4
0
        public IEnumerable <Message> RetrieveMessages(int messageAmount, int timeout)
        {
            var brokeredMessages = _client.ReceiveBatch(messageAmount, TimeSpan.FromSeconds(timeout));
            var messages         = new List <Message>();

            foreach (var brokeredMessage in brokeredMessages)
            {
                var     stream  = brokeredMessage.GetBody <Stream>();
                Message message = new Message(stream,
                                              brokeredMessage.SessionId,
                                              brokeredMessage.Label,
                                              brokeredMessage.Properties);

                messages.Add(message);
            }

            return(messages);
        }
Пример #5
0
        public List <Message> RetrieveMessages(int messageAmount, int timeout)
        {
            var brokeredMessages = _client.ReceiveBatch(messageAmount, TimeSpan.FromSeconds(timeout));
            var messages         = new List <Message>();

            foreach (var brokeredMessage in brokeredMessages)
            {
                Message message = new Message();

                var stream = brokeredMessage.GetBody <Stream>();
                message.Content    = _serializer.ParseMessage <object>(stream);
                message.Label      = brokeredMessage.Label;
                message.SessionId  = brokeredMessage.SessionId;
                message.Properties = new Dictionary <string, object>(brokeredMessage.Properties);
                messages.Add(message);
            }

            return(messages);
        }
Пример #6
0
        /// <summary>
        /// Starts listening for messages on the configured Service Bus Subscription.
        /// </summary>
        private void ListenForMessages()
        {
            ThreadStart ts = () =>
            {
                while (!StopProcessingMessageToken.IsCancellationRequested)
                {
                    var messages = _serviceBusClient.ReceiveBatch(ServiceBusMessageBatchSize, ServiceBusServerTimeout);
                    foreach (var message in messages)
                    {
                        if (StopProcessingMessageToken.IsCancellationRequested)
                        {
                            break;
                        }
                        ReceiveMessage(message);
                    }
                }
            };

            StartBackgroundThread(ts);
        }
        protected override void StartProcessing <T1>(SubscriptionClient subscriptionClient, Action <IEnumerable <T1> > messagesReceived)
        {
            log.Info($"Initialising batcher. BatchSize={BatchSize}, MaxTimeToWaitForBatch={maxTimeToWaitForBatch}");
            var batcher = new Batcher <BrokeredMessage>(messages => ProcessMessages(subscriptionClient, messagesReceived, messages), BatchSize, this.maxTimeToWaitForBatch);

            log.Info("Batcher initialised");

            while (true)
            {
                log.Info("Waiting to receive batch");

                var batch = subscriptionClient.ReceiveBatch(BatchSize);

                var brokeredMessages = batch as BrokeredMessage[] ?? batch.ToArray();

                log.Info($"Received batch of {brokeredMessages.Length} messages");

                foreach (var brokeredMessage in brokeredMessages)
                {
                    batcher.Post(brokeredMessage);
                }
            }
        }
Пример #8
0
        private void ReceiveTopicMessages(CancellationTokenSource cancellationSource,
                                          OnMessagesReceived onMessagesReceived)
        {
            var  needPeek       = true;
            long sequenceNumber = 0;
            IEnumerable <BrokeredMessage> brokeredMessages = null;

            #region peek messages that not been consumed since last time

            while (!cancellationSource.IsCancellationRequested && needPeek)
            {
                try
                {
                    brokeredMessages = _subscriptionClient.PeekBatch(sequenceNumber, 50);
                    if (brokeredMessages == null || brokeredMessages.Count() == 0)
                    {
                        break;
                    }
                    var messageContexts = new List <IMessageContext>();
                    foreach (var message in brokeredMessages)
                    {
                        if (message.State != MessageState.Deferred)
                        {
                            needPeek = false;
                            break;
                        }
                        messageContexts.Add(new MessageContext(message));
                        sequenceNumber = message.SequenceNumber + 1;
                    }
                    onMessagesReceived(messageContexts.ToArray());
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    Thread.Sleep(1000);
                    _logger.Error($"subscriptionClient.ReceiveBatch {_subscriptionClient.Name} failed", ex);
                }
            }

            #endregion

            #region receive messages to enqueue consuming queue

            while (!cancellationSource.IsCancellationRequested)
            {
                try
                {
                    brokeredMessages =
                        _subscriptionClient.ReceiveBatch(50,
                                                         Configuration.Instance.GetMessageQueueReceiveMessageTimeout());
                    foreach (var message in brokeredMessages)
                    {
                        message.Defer();
                        onMessagesReceived(new MessageContext(message));
                    }
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    Thread.Sleep(1000);
                    _logger.Error($"subscriptionClient.ReceiveBatch {_subscriptionClient.Name} failed", ex);
                }
            }

            #endregion
        }
Пример #9
0
        public static async void Run(TimerInfo rewardsResponseTimer, ICollector <string> errormessage, TraceWriter log)
        {
            log.Verbose($"C# timer function processed a request.", "JE.RMS.Services.ScheduledReadRewardsRequestRecieved");

            try
            {
                //Service bus queue names and connection stringsAllFulfillmentResponseSubscription
                var connectionString = ConfigurationManager.AppSettings["MyServiceBusReader"].ToString();
                SubscriptionClient AllFulfillmentResponseSubscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, "fulfillmentresponse", "AllFulfillmentResponseSubscription");
                var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
                int BatchSize        = Convert.ToInt32(ConfigurationManager.AppSettings["RewardFulfillmentResponseBatchSize"]);
                IEnumerable <BrokeredMessage> RecievedMessage = null;
                long MessageCount = namespaceManager.GetSubscription("fulfillmentresponse", "AllFulfillmentResponseSubscription").MessageCount;
                if (MessageCount > 0)
                {
                    RecievedMessage = AllFulfillmentResponseSubscriptionClient.ReceiveBatch(BatchSize);
                }
                log.Verbose($"After the reading of queue message = {MessageCount}", "JE.RMS.Services.ScheduledReadRewardsRequestRecieved");
                List <Guid> messageLockTokenList = new List <System.Guid>();
                if (RecievedMessage != null && RecievedMessage.Count() > 0)
                {
                    foreach (BrokeredMessage message in RecievedMessage)
                    {
                        var responsemessage = message.GetBody <FulfillmentResponse>();
                        //var responsemessage = JsonConvert.DeserializeObject<FulfillmentResponse>(raw);

                        log.Verbose($"C# trigger queue function processed a request. inputmessage={responsemessage}", "JE.RMS.Services.OnRewardsResponseRecieved");
                        #region Update Audit Fields
                        //Update timestapm in Audit fields
                        List <SqlParameter> AuditParam = new List <SqlParameter>();
                        AuditParam.Add(new SqlParameter("@RMSRewardID", responsemessage.RMSRewardID));

                        var RMSRewardID = MSSQLConnection.ExecuteStoredProcedure <string>(USPContstants.UpdateAuditFieldsInRewardsTrx, AuditParam);
                        log.Verbose($"FulfillmentResponseTimestamp updated successfully. RMSRewardID={RMSRewardID[0]}", "JE.RMS.Services.OnRewardsResponseRecieved");
                        string RewardTrxStatus = "Fulfillment completed";
                        if (responsemessage.Status == "Fail")
                        {
                            RewardTrxStatus = "Error";
                        }

                        List <SqlParameter> MessageLogParams = new List <SqlParameter>();
                        MessageLogParams.Add(new SqlParameter("@RMSRewardID", responsemessage.RMSRewardID));
                        MessageLogParams.Add(new SqlParameter("@MessageType", MessageType.RewardFulfillmentResponse.GetDescription()));
                        MessageLogParams.Add(new SqlParameter("@IPAddress", responsemessage.ClientIP));
                        MessageLogParams.Add(new SqlParameter("@Message", JsonConvert.SerializeObject(responsemessage)));
                        MessageLogParams.Add(new SqlParameter("@RewardsTrxID", null));
                        var ErrorMessageLogID = MSSQLConnection.ExecuteStoredProcedure <long>(USPContstants.SaveMessageLog, MessageLogParams);
                        log.Verbose($"MessageLog stored successfully. MessageLogID={ErrorMessageLogID[0]}", "JE.RMS.Services.ProcessFulfillmentForEnergyEarth");

                        ////Call stored procedure to Save RewardTrxChangeLog
                        List <SqlParameter> RewardTrxChangeLogParams = new List <SqlParameter>();
                        RewardTrxChangeLogParams.Add(new SqlParameter("@RMSRewardID", responsemessage.RMSRewardID));
                        RewardTrxChangeLogParams.Add(new SqlParameter("@RewardTrxStatus", RewardTrxStatus));
                        RewardTrxChangeLogParams.Add(new SqlParameter("@Comment", string.Empty));
                        RewardTrxChangeLogParams.Add(new SqlParameter("@RewardsTrxID", null));

                        var RewardTrxChangeLogID = MSSQLConnection.ExecuteStoredProcedure <long>(USPContstants.SaveRewardTrxChangeLog, RewardTrxChangeLogParams);
                        log.Verbose($"RewardTrxChangeLog stored successfully. RewardTrxChangeLogID={RewardTrxChangeLogID[0]}", "JE.RMS.Services.OnRewardsResponseRecieved");
                        #endregion
                        messageLockTokenList.Add(message.LockToken);
                    }
                    AllFulfillmentResponseSubscriptionClient.CompleteBatch(messageLockTokenList);
                }
            }
            catch (Exception ex)
            {
                log.Error($"Exception ={ex}", ex, "JE.RMS.Services.OnRewardsRequestRecieved");
                errormessage.Add(JsonConvert.SerializeObject(ex).ToString());
            }
        }
Пример #10
0
        public static RewardFulfillmentResponseList GetMessagesFromSubscription(long FulfillmentChannelID, RewardFulfillmentResponseList resp, TraceWriter log)
        {
            IEnumerable <BrokeredMessage> RecievedMessage = null;
            long MessageCount = 0;

            if (resp.RewardFulfillmentRequest == null)
            {
                resp.RewardFulfillmentRequest = new List <RewardFulfillmentRequest>();
            }
            BatchSize = BatchSize - resp.RewardFulfillmentRequest.Count;
            if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.GBASSTariff)
            {
                MessageCount = namespaceManager.GetSubscription("fulfillmentrequest", "GBASSTariffSubscription").MessageCount;
                if (MessageCount > 0)
                {
                    RecievedMessage = GBASSTariffSubscription.ReceiveBatch(BatchSize, new TimeSpan(0, 0, 0));
                }
            }
            else if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.GBASSCTLAdj)
            {
                MessageCount = namespaceManager.GetSubscription("fulfillmentrequest", "GBASSCTLAdjSubscription").MessageCount;
                if (MessageCount > 0)
                {
                    RecievedMessage = GBASSCTLAdjSubscription.ReceiveBatch(BatchSize, new TimeSpan(0, 0, 0));
                }
            }
            else if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.Cheque)
            {
                MessageCount = namespaceManager.GetSubscription("fulfillmentrequest", "SmartConnectSubscription").MessageCount;
                if (MessageCount > 0)
                {
                    RecievedMessage = SmartConnectSubscriptionClient.ReceiveBatch(BatchSize, new TimeSpan(0, 0, 0));
                }
            }
            List <Guid> messageLockTokenList = new List <System.Guid>();

            resp.HasMoreMessages = false;
            if (RecievedMessage != null && RecievedMessage.Count() > 0)
            {
                foreach (BrokeredMessage message in RecievedMessage)
                {
                    var    raw = message.GetBody <string>();
                    var    RewardFulfillmentRequestObj = JsonConvert.DeserializeObject <RewardFulfillmentRequestList>(raw);
                    string RMSRewardID = RewardFulfillmentRequestObj.RewardFulfillmentRequest.RMSRewardID;
                    ////Call stored procedure to Update RewardTrx
                    List <SqlParameter> RewardTrxParams = new List <SqlParameter>();
                    RewardTrxParams.Add(new SqlParameter("@RMSRewardID", RMSRewardID));
                    var UpdatedRewardTrxID = MSSQLConnection.ExecuteStoredProcedure <long>(USPContstants.UpdateProcessFulfillmentTimestamp, RewardTrxParams).FirstOrDefault();
                    log.Verbose($"RewardTrx updated successfully. RewardTrID={UpdatedRewardTrxID}", "JE.RMS.Services.GetRewardFulfillmentRequest");
                    resp.RewardFulfillmentRequest.Add(RewardFulfillmentRequestObj.RewardFulfillmentRequest);
                    messageLockTokenList.Add(message.LockToken);
                }

                if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.GBASSTariff)
                {
                    GBASSTariffSubscription.CompleteBatch(messageLockTokenList);
                }
                else if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.GBASSCTLAdj)
                {
                    GBASSCTLAdjSubscription.CompleteBatch(messageLockTokenList);
                }
                else if (FulfillmentChannelID == (int)Common.Constants.FulfillmentChannel.Cheque)
                {
                    SmartConnectSubscriptionClient.CompleteBatch(messageLockTokenList);
                }
            }

            resp.HasMoreMessages = MessageCount > resp.RewardFulfillmentRequest.Count ? true : false;
            if (resp.HasMoreMessages && resp.RewardFulfillmentRequest.Count < RepeatCallSize)
            {
                GetMessagesFromSubscription(FulfillmentChannelID, resp, log);
            }
            resp.TotalRecord = MessageCount;
            return(resp);
        }