示例#1
0
        /// <summary>
        /// Reads an EDI item from the stream.
        /// An EDI item is an IEdiControl or a message or a ParsingException.
        /// </summary>
        /// <returns>Indication if an item was read.</returns>
        public bool Read()
        {
            Item = null;

            try
            {
                while ((!StreamReader.EndOfStream || Buffer.Any()) && Item == null)
                {
                    ProcessSegment(ReadSegment());

                    if (Separators != null)
                    {
                        continue;
                    }

                    Item = new ParsingException(ErrorCodes.InvalidControlStructure, "No valid interchange header was found.");
                }
            }
            catch (ParsingException ex)
            {
                Item = ex;
            }
            catch (Exception ex)
            {
                Item = new ParsingException(ErrorCodes.Unknown, ex.Message, ex);
            }

            if (StreamReader.EndOfStream && CurrentMessage.Any())
            {
                Item = new ParsingException(ErrorCodes.ImproperEndOfFile, "Unprocessed segments before the end of file.");
                CurrentMessage.Clear();
            }

            return(Item != null);
        }
示例#2
0
        public void Perform_a_large_request_response_pool()
        {
            const int repeatCount = 20000;

            int responsesReceived = 0;

            ManualResetEvent completed = new ManualResetEvent(false);

            LocalBus.Subscribe <PingMessage>(x => CurrentMessage.Respond(new PongMessage(x.CorrelationId)));
            LocalBus.Subscribe <PongMessage>(x =>
            {
                if (Interlocked.Increment(ref responsesReceived) == repeatCount)
                {
                    completed.Set();
                }
            });

            Thread.Sleep(3.Seconds());

            Stopwatch stopwatch = Stopwatch.StartNew();

            for (int index = 0; index < repeatCount; index++)
            {
                LocalBus.Publish(new PingMessage());
            }

            bool success = completed.WaitOne(60.Seconds(), true);

            stopwatch.Stop();

            Trace.WriteLine(string.Format("Elapsed Time for {0} messages = {1}", repeatCount * 2, stopwatch.Elapsed));
            Trace.WriteLine(string.Format("Messages Per Second = {0}", repeatCount * 2000 / stopwatch.ElapsedMilliseconds));
        }
示例#3
0
 public static DataEventAction <T, TData> RetryLater <T, TData>(this DataEventAction <T, TData> eventAction)
     where T : SagaStateMachine <T>, ISaga
     where TData : class
 {
     eventAction.Call((saga, message) => CurrentMessage.RetryLater());
     return(eventAction);
 }
示例#4
0
        public void The_retry_count_should_be_set_on_the_message()
        {
            FutureMessage <PingMessage> future = new FutureMessage <PingMessage>();

            bool first = true;

            LocalBus.Subscribe <PingMessage>(message =>
            {
                if (first)
                {
                    Assert.AreEqual(0, CurrentMessage.Headers.RetryCount);

                    CurrentMessage.RetryLater();

                    first = false;
                }
                else
                {
                    Assert.AreEqual(1, CurrentMessage.Headers.RetryCount);

                    future.Set(message);
                }
            });

            LocalBus.Publish(new PingMessage());

            Assert.IsTrue(future.IsAvailable(5.Seconds()));
        }
        void EditMessageCore(bool sendMessage, bool closeWindow)
        {
            if (isCopyOfCurrentMessage)
            {
                CurrentMessage.Assign(NewMessage);
                NewMessage = CurrentMessage;
            }
            NewMessage.Type = sendMessage ? MessageType.Sent : MessageType.Draft;
            NewMessage.NormalizeEmails();
            if (!Items.Contains(NewMessage))
            {
                Items.Add(NewMessage);
                if (!sendMessage)
                {
                    NewMessage.IsUnread = true;
                    UpdateMailUnreadCount(mailFolders);
                }
            }

            UpdateItemsSource();
            NewMessage = null;
            if (closeWindow)
            {
                this.GetService <IWindowService>().Close();
            }
        }
示例#6
0
        /// <summary>
        /// Tries to parse what had been collected before a new message starts.
        /// </summary>
        /// <param name="segmentContext">The current segment.</param>
        /// <param name="tag">The start new message tag.</param>
        /// <returns>If flushed.</returns>
        internal bool Flush(SegmentContext segmentContext, SegmentTags tag)
        {
            if ((segmentContext.IsControl || segmentContext.Tag == tag) && CurrentMessage.Any())
            {
                foreach (var c in segmentContext.Value)
                {
                    Buffer.Enqueue(c);
                }
                Buffer.Enqueue(Separators.Segment);

                try
                {
                    if (CurrentGroupHeader != null)
                    {
                        CurrentMessage.Add(CurrentGroupHeader);
                    }
                    Item = CurrentMessage.Analyze(Separators, BuildContext());
                }
                finally
                {
                    CurrentMessage.Clear();
                }

                return(true);
            }

            return(false);
        }
示例#7
0
        internal override MessageContext BuildContext()
        {
            var unh = CurrentMessage.SingleOrDefault(es => es.Tag == SegmentId.UNH);

            if (unh == null)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent, "UNH was not found.");
            }
            var ediCompositeDataElements = unh.Value.GetDataElements(Separators);

            if (ediCompositeDataElements.Count() < 2)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent,
                                           "UNH is invalid. Too little data elements.", unh.Value);
            }
            var ediDataElements = ediCompositeDataElements[1].GetComponentDataElements(Separators);

            if (ediDataElements.Count() < 3)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent,
                                           "UNH is invalid. Unable to read message type or version.", unh.Value);
            }

            var tag           = ediDataElements[0];
            var version       = ediDataElements[1] + ediDataElements[2];
            var controlNumber = ediCompositeDataElements[0];

            return(new MessageContext(tag, controlNumber, version, "Edifact", RulesAssembly, RulesNamespacePrefix));
        }
示例#8
0
        private void ThreadedLoad()
        {
            try {
                item.LoadDetails();
                ThreadAssist.ProxyToMain(delegate {
                    ClearMessages();
                    if (item.Details != null)
                    {
                        gui.Contents.UpdateDetails();
                    }
                });
            } catch (Exception e) {
                Log.Error("Error loading IA item details", e);

                ThreadAssist.ProxyToMain(delegate {
                    var web_e = e as System.Net.WebException;
                    if (web_e != null && web_e.Status == System.Net.WebExceptionStatus.Timeout)
                    {
                        SetStatus(Catalog.GetString("Timed out getting item details from the Internet Archive"), true);
                        CurrentMessage.AddAction(new MessageAction(Catalog.GetString("Try Again"), (o, a) => Load()));
                    }
                    else
                    {
                        SetStatus(Catalog.GetString("Error getting item details from the Internet Archive"), true);
                    }
                });
            }
        }
示例#9
0
        internal override MessageContext BuildContext()
        {
            if (CurrentGroupHeader == null)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent, "GS was not found.");
            }
            var ediCompositeDataElementsGs = CurrentGroupHeader.Value.GetDataElements(Separators);

            if (ediCompositeDataElementsGs.Count() < 8)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent, "GS is invalid. Too little data elements.");
            }
            var version = ediCompositeDataElementsGs[7];

            var st = CurrentMessage.SingleOrDefault(es => es.Tag == SegmentTags.ST);

            if (st == null)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent, "ST was not found.");
            }
            var ediCompositeDataElementsSt = st.Value.GetDataElements(Separators);
            var tag = ediCompositeDataElementsSt[0];

            if (ediCompositeDataElementsSt.Count() == 3)
            {
                version = ediCompositeDataElementsSt[2];
            }
            if (ediCompositeDataElementsSt.Count() < 2)
            {
                throw new ParsingException(ErrorCodes.InvalidInterchangeContent, "ST is invalid.Too little data elements.");
            }
            var controlNumber = ediCompositeDataElementsSt[1];

            return(new MessageContext(tag, controlNumber, version, "X12", RulesAssemblyName, RulesNamespacePrefix));
        }
示例#10
0
        public void A_response_should_be_sent_directly_if_a_reply_address_is_specified()
        {
            PingMessage ping = new PingMessage();

            TestMessageConsumer <PongMessage> otherConsumer = new TestMessageConsumer <PongMessage>();

            RemoteBus.Subscribe(otherConsumer);

            TestCorrelatedConsumer <PongMessage, Guid> consumer = new TestCorrelatedConsumer <PongMessage, Guid>(ping.CorrelationId);

            LocalBus.Subscribe(consumer);

            FutureMessage <PongMessage> pong = new FutureMessage <PongMessage>();

            RemoteBus.Subscribe <PingMessage>(message =>
            {
                pong.Set(new PongMessage(message.CorrelationId));

                CurrentMessage.Respond(pong.Message);
            });

            LocalBus.Publish(ping, context => context.SendResponseTo(LocalBus));

            Assert.IsTrue(pong.IsAvailable(3.Seconds()), "No pong generated");

            consumer.ShouldHaveReceivedMessage(pong.Message, 3.Seconds());
            otherConsumer.ShouldNotHaveReceivedMessage(pong.Message, 1.Seconds());
        }
示例#11
0
 public static DataEventAction <T, TData> RespondWith <T, TData, TMessage>(this DataEventAction <T, TData> eventAction, Func <T, TData, TMessage> action)
     where T : SagaStateMachine <T>, ISaga
     where TData : class
     where TMessage : class
 {
     eventAction.Call((saga, message) => CurrentMessage.Respond(action(saga, message)));
     return(eventAction);
 }
示例#12
0
 /// <summary>
 /// Adds text to the current message
 /// </summary>
 public void AddTextToMessage(string text)
 {
     if (!string.IsNullOrEmpty(text))
     {
         var txt_bytes = Encoding.ASCII.GetBytes(text).ToList();
         CurrentMessage.AddRange(txt_bytes);
         NotifyPropertyChanged("CurrentMessage");
     }
 }
示例#13
0
 public void SetMessage(MessageView mv)
 {
     if (CurrentMessage != null)
     {
         CurrentMessage.ClearContents();
     }
     stackMessage.Clear();
     UpdateCurrentMessage(mv);
 }
示例#14
0
 public void A_pong_service()
 {
     PingService = new ConsumerOf <Ping>(ping =>
     {
         // Response with a pong to the ping
         CurrentMessage.Respond(new Pong(ping.CorrelationId));
     });
     RemoteBus.Subscribe(PingService);
 }
示例#15
0
        internal override void ProcessSegment(string segment)
        {
            if (string.IsNullOrEmpty(segment) || Separators == null)
            {
                return;
            }

            var segmentContext = new SegmentContext(segment, Separators);

            if (Flush(segmentContext, SegmentId.UNH))
            {
                return;
            }

            switch (segmentContext.Tag)
            {
            case SegmentId.UNA:
                break;

            case SegmentId.UNB:
                Item = segmentContext.Value.ParseSegment <S_UNB>(Separators);
                break;

            case SegmentId.UNG:
                Item = segmentContext.Value.ParseSegment <S_UNG>(Separators);
                break;

            case SegmentId.UNH:
                CurrentMessage.Add(segmentContext);
                break;

            case SegmentId.UNT:
                try
                {
                    CurrentMessage.Add(segmentContext);
                    Item = CurrentMessage.Analyze(Separators, BuildContext());
                }
                finally
                {
                    CurrentMessage.Clear();
                }
                break;

            case SegmentId.UNE:
                Item = segmentContext.Value.ParseSegment <S_UNE>(Separators);
                break;

            case SegmentId.UNZ:
                Item = segmentContext.Value.ParseSegment <S_UNZ>(Separators);
                break;

            default:
                CurrentMessage.Add(segmentContext);
                break;
            }
        }
示例#16
0
        private static Action <FirstCommand> FirstCommandConsumer(FirstCommand message)
        {
            return(command =>
            {
                ThreadUtil.Sleep(10.Milliseconds());

                var response = new FirstResponse(command.CorrelationId);

                CurrentMessage.Respond(response);
            });
        }
示例#17
0
        private void lineRemoveButton_Click(object sender, EventArgs e)
        {
            int line = lineNum.SelectedIndex;

            CurrentMessage.RemoveAt(line);
            if (line == CurrentMessage.Count)
            {
                --line;
            }
            UpdateLineSelect();
            lineNum.SelectedIndex = line;
        }
示例#18
0
        /// <summary>
        /// Sends the current message across the serial line
        /// </summary>
        public void SendCurrentMessage()
        {
            lock (_serial_port_lock)
            {
                if (_serial_port != null && _serial_port.IsOpen)
                {
                    _serial_port.Write(CurrentMessage.ToArray(), 0, CurrentMessage.Count);
                }
            }

            CurrentMessage.Clear();
            NotifyPropertyChanged("CurrentMessage");
        }
示例#19
0
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = Id.GetHashCode();
         hashCode = (hashCode * 397) ^ (Description != null ? Description.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (int)State;
         hashCode = (hashCode * 397) ^ StartTime.GetHashCode();
         hashCode = (hashCode * 397) ^ FinishTime.GetHashCode();
         hashCode = (hashCode * 397) ^ (Result != null ? Result.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (CurrentMessage != null ? CurrentMessage.GetHashCode() : 0);
         return(hashCode);
     }
 }
        private bool ValidateCurrentMessage()
        {
            if (!string.IsNullOrWhiteSpace(CurrentMessage.RoutingKey))
            {
                return(true);
            }
            else
            {
                CurrentLog.Error(CurrentMessage, $"Message without routing key has been received. Skipping it. Processor #{_id}.");

                CurrentMessage.Ack();

                return(false);
            }
        }
示例#21
0
        public override Task SendAsync(ArraySegment <byte> buffer, WebSocketMessageType messageType, bool endOfMessage,
                                       CancellationToken cancellationToken)
        {
            if (buffer.Array != null)
            {
                CurrentMessage.Write(buffer.Array, buffer.Offset, buffer.Count);
            }

            if (endOfMessage)
            {
                Messages.Add(CurrentMessage);
                CurrentMessage = new ChunkedMemoryStream();
            }

            return(Task.CompletedTask);
        }
        public void Consume(SendOrderDetailsRequest request)
        {
            // simulate a call to the external service

            ThreadUtil.Sleep(1.Seconds());

            var details = new OrderDetailsResponse
            {
                OrderId    = request.OrderId,
                CustomerId = request.CustomerId,
                Created    = (-1).Days().FromUtcNow(),
                Status     = OrderStatus.InProcess,
            };

            CurrentMessage.Respond(details, x => x.ExpiresAt(5.Minutes().FromNow()));
        }
示例#23
0
        private void DeleteMessage(object sender, ExecutedRoutedEventArgs e)
        {
            if (CurrentMessage != null)
            {
                CurrentMessage.SetDeleted(true);
            }

            NextMessage(sender, null);

            if (CurrentMessage == null)
            {
                // Didn't have a next message.

                Close();
            }
        }
示例#24
0
        private void ProcessNewOrder(NewOrderMessage message)
        {
            _name   = message.Name;
            _item   = message.Item;
            _size   = message.Size;
            _amount = GetPriceForSize(_size);

            Console.WriteLine(string.Format("I've received an order for a {0} {1} for {2}.", _size, _item, _name));

            var paymentDueMessage = new PaymentDueMessage
            {
                CorrelationId = message.CorrelationId,
                Amount        = _amount,
            };

            CurrentMessage.Respond(paymentDueMessage);
        }
示例#25
0
        public void Consume(T message)
        {
            WorkerDetails worker = _selectionStrategy.GetAvailableWorkers(_workers.Values, message, false).FirstOrDefault();

            if (worker == null)
            {
                CurrentMessage.RetryLater();
                return;
            }

            worker.Add();

            IEndpoint endpoint = _endpointFactory.GetEndpoint(worker.DataUri);

            var distributed = new Distributed <T>(message, CurrentMessage.Headers.ResponseAddress);

            endpoint.Send(distributed);
        }
示例#26
0
 public static bool ProcessSingleMessage(
     CurrentMessageInformation currentMessageInformation,
     Func <CurrentMessageInformation, bool> messageRecieved)
 {
     if (messageRecieved == null)
     {
         return(false);
     }
     foreach (Func <CurrentMessageInformation, bool> func in messageRecieved.GetInvocationList())
     {
         using (CurrentMessage.Track(currentMessageInformation))
             if (func(currentMessageInformation))
             {
                 return(true);
             }
     }
     return(false);
 }
        private async Task ProcessMessageAsync(
            IMessageSubscription subscription,
            EnvelopedMessage envelopedMessage,
            object payload,
            MessageHeaders headers)
        {
            var publisher = _repliesPublisher?.Invoke(headers.CorrelationId)
                            ?? ProhibitedRepliesMessagePublisher.Instance;

            var handlingContext = new MessageHandlingContext
                                  (
                envelopedMessage.Exchange,
                envelopedMessage.RetryCount,
                envelopedMessage.RoutingKey
                                  );
            var result = await subscription.InvokeHandlerAsync(_serviceProvider, payload, headers, handlingContext, publisher);

            if (result == null)
            {
                throw new InvalidOperationException("Result should be not null");
            }

            switch (result)
            {
            case MessageHandlingResult.SuccessResult _:
            case MessageHandlingResult.NonTransientFailureResult _:
                CurrentMessage.Ack();
                break;

            case MessageHandlingResult.TransientFailureResult tfr:
                _retryManager.ScheduleRetry(CurrentMessage, tfr.RetryAfter ?? _defaultRetryTimeout);
                break;

            default:
                throw new NotSupportedException($"Unexpected message handling result [{result.GetType().Name}].");
            }
        }
示例#28
0
        /// <summary>
        /// Parses a text string for bytes the user would like to add to the current message
        /// Bytes should be separated by spaces.
        /// If a byte starts with "0x", it will be parsed as a hexidecimal value.
        /// Otherwise, it will be parsed as a decimal value.
        /// </summary>
        public void AddBytesToMessage(string text)
        {
            if (!string.IsNullOrEmpty(text))
            {
                var string_pieces = text.Split(new char[] { ' ' }).ToList();
                if (string_pieces.Count > 0)
                {
                    for (int i = 0; i < string_pieces.Count; i++)
                    {
                        var this_piece = string_pieces[i];
                        if (this_piece.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase))
                        {
                            //Parse as a hexidecimal value
                            this_piece = this_piece.Substring(2);
                            bool hex_parsed_successfully = Byte.TryParse(this_piece,
                                                                         NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byte hex_result);
                            if (hex_parsed_successfully)
                            {
                                CurrentMessage.Add(hex_result);
                            }
                        }
                        else
                        {
                            //Parse as a decimal value
                            bool decimal_parsed_successfully = Byte.TryParse(this_piece, out byte decimal_result);
                            if (decimal_parsed_successfully)
                            {
                                CurrentMessage.Add(decimal_result);
                            }
                        }
                    }

                    NotifyPropertyChanged("CurrentMessage");
                }
            }
        }
示例#29
0
        private async Task <List <CurrentMessage> > GetMessagesPartsAsync(List <Message> messages, GmailService service)
        {
            List <CurrentMessage> messagesInfo = new List <CurrentMessage>();

            if (messages != null)
            {
                foreach (var msg in messages)
                {
                    UsersResource.MessagesResource.GetRequest emailInfoRequest = service.Users.Messages.Get("me", msg.Id);
                    var emailInfoResponse = await emailInfoRequest.ExecuteAsync();

                    if (emailInfoResponse != null)
                    {
                        CurrentMessage currentMsg = new CurrentMessage();
                        foreach (var mParts in emailInfoResponse.Payload.Headers)
                        {
                            currentMsg.Id = msg.Id;
                            if (mParts.Name == "Date")
                            {
                                currentMsg.Date = mParts.Value;
                            }
                            else if (mParts.Name == "From")
                            {
                                currentMsg.From = mParts.Value;
                            }
                            else if (mParts.Name == "Subject")
                            {
                                currentMsg.Subject = mParts.Value;
                            }
                        }
                        messagesInfo.Add(currentMsg);
                    }
                }
            }
            return(messagesInfo);
        }
示例#30
0
        public static void Bootstrap()
        {
            var bus = ObjectFactory.GetInstance <IServiceBus>();

            bus.Subscribe <OrderDetailRequestActor>();

            bus.Subscribe <RetrieveOrderDetails>(message =>
            {
                var details = new OrderDetailsReceivedImpl(message.CustomerId, message.OrderId, SystemUtil.Now, OrderStatus.Accepted);

                // TODO
                // impl builder

                // var message = BuildImpl<ODR>(x =>
                //	{ x.Set(y => y.CustomerId, customerId)
                //	}


                CurrentMessage.Respond(details);
            });


            PipelineViewer.Trace(bus.InboundPipeline);
        }