public IFatpipeMessage GetSuspendedMessage(string messageIdentifier)
        {
            string                 location         = "FpmDal->GetSuspendedMessage";
            IFatpipeMessage        result           = null;
            SuspendedMessageEntity suspendedMessage = null;

            try
            {
                Stopwatch watch = Stopwatch.StartNew();

                suspendedMessage =
                    (from e in this.suspendedTableServiceContext.CreateQuery <SuspendedMessageEntity>(MaargConfiguration.Instance[MaargConfiguration.SuspendedMessageTableName])
                     where e.RowKey == messageIdentifier
                     select e).FirstOrDefault();

                if (suspendedMessage != null)
                {
                    IFatpipeMessage message = null;
                    CloudBlob       blob    = this.suspendedContainer.GetBlobReference(suspendedMessage.SuspendedMessageBlobReference);
                    using (MemoryStream stream = new MemoryStream())
                    {
                        blob.DownloadToStream(stream);
                        stream.Position = 0;
                        message         = BizpipeMesssageStreaming.CreateBizpipeMessageFromStream(stream, this.fpm);
                    }

                    if (!string.IsNullOrEmpty(suspendedMessage.PartnerIdentifier))
                    {
                        IOutboundFatpipeMessage outboundMessage = this.fpm.CreateNewOutboundMessage();
                        outboundMessage.Header                    = message.Header;
                        outboundMessage.Body                      = message.Body;
                        outboundMessage.Status                    = message.Status;
                        outboundMessage.RoutingInfo               = new RoutingInfo();
                        outboundMessage.RoutingInfo.PartnerId     = suspendedMessage.PartnerIdentifier;
                        outboundMessage.RoutingInfo.TransportType = TransportType.Suspend;

                        result = outboundMessage;
                    }
                    else
                    {
                        result = message;
                    }
                }

                watch.Stop();
                LoggerFactory.Logger.Debug(location,
                                           "Message {0} retrieved from suspended queue in {1} ms.",
                                           messageIdentifier,
                                           watch.ElapsedMilliseconds);
            }
            catch (Exception exception)
            {
                LoggerFactory.Logger.Error(location, EventId.BizpipeGetSuspendMessage
                                           , "Error getting the suspended message {0}: {1}."
                                           , messageIdentifier
                                           , exception.ToString());
            }

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Used by OutboundTransportManager
        ///
        /// 1. DeQ bunch of messages from OutboundQueue
        /// 2. Transport each of them
        /// 3. RemoveFromQ each of them or suspend them as appropriate
        /// </summary>
        /// <param name="count">Number of messages to DeQ</param>
        /// <returns></returns>
        public List <IOutboundFatpipeMessage> DeQFromOutgoingQ(int count)
        {
            int             iter = 0;
            IFatpipeMessage msg  = null;
            List <IOutboundFatpipeMessage> msgList = new List <IOutboundFatpipeMessage>();

            while (iter < count)
            {
                msg = fpmDal.Dequeue(Constants.QueueType.OUTBOUND);
                if (msg == null)
                {
                    break;
                }

                IOutboundFatpipeMessage message = msg as IOutboundFatpipeMessage;
                string partnerId;
                bool   flag = msg.Header.Context.TryGetValue("PartnerId", out partnerId);
                if (flag)
                {
                    RoutingInfo routingInfo = new RoutingInfo(partnerId, TransportType.None);
                    flag = msg.Header.Context.TryGetValue("TransportType", out partnerId);
                    routingInfo.TransportType = (TransportType)Enum.Parse(typeof(TransportType), partnerId, true);
                    message.RoutingInfo       = routingInfo;
                }

                msgList.Add(message);
                iter++;
            }

            return(msgList);
        }
        public bool SaveSuspendedMessage(IFatpipeMessage message)
        {
            string location = "FpmDal->SaveSuspendedMessage";
            bool   result   = true;
            SuspendedMessageEntity suspendedMessage = null;

            //TODO remove the return statement
            // don't want any message to be suspended
            return(true);

            try
            {
                Stopwatch watch = Stopwatch.StartNew();
                suspendedMessage           = new SuspendedMessageEntity(message.Header.TenantIdentifier, message.Header.Identifier);
                suspendedMessage.Timestamp = DateTime.UtcNow;
                suspendedMessage.SuspendedMessageBlobReference = message.Header.Identifier;
                if (message.Status != null)
                {
                    suspendedMessage.ErrorMessage = string.Format(CultureInfo.InvariantCulture,
                                                                  "{0}. Message suspended after {1} retries. Error: {2}",
                                                                  message.Status.ProcessingResult,
                                                                  message.Status.NumberOfRetryAttempts,
                                                                  message.Status.ErrorDescription);
                }
                IOutboundFatpipeMessage outboundMessage = message as IOutboundFatpipeMessage;
                if (outboundMessage != null)
                {
                    if (outboundMessage.RoutingInfo != null)
                    {
                        suspendedMessage.PartnerIdentifier = outboundMessage.RoutingInfo.PartnerId;
                    }
                }

                this.suspendedTableServiceContext.AddObject(MaargConfiguration.Instance[MaargConfiguration.SuspendedMessageTableName], suspendedMessage);

                //save to suspended table and blob
                DataServiceResponse response = this.suspendedTableServiceContext.SaveChangesWithRetries();
                // The entry in the Q is the message blob name
                using (Stream stream = BizpipeMesssageStreaming.WriteBizpipeMessageToStream(message))
                {
                    CloudBlob blob = this.suspendedContainer.GetBlobReference(suspendedMessage.SuspendedMessageBlobReference);
                    blob.UploadFromStream(stream);
                }

                watch.Stop();
                LoggerFactory.Logger.Debug(location,
                                           "Message {0} saved to suspended queue in {1} ms.",
                                           message.Header.Identifier,
                                           watch.ElapsedMilliseconds);
            }
            catch (Exception exception)
            {
                LoggerFactory.Logger.Error(location, EventId.BizpipeSaveSuspendMessage
                                           , "Exception encountered during suspended message operation: {0}."
                                           , exception.ToString());
                result = false;
            }

            return(result);
        }