/// <summary>
        ///     Processor for user defined messages.
        /// </summary>
        /// <param name="message">The message.</param>
        protected override bool Receive(object message)
        {
            var       deadLetter = (DeadLetter)message;
            IActorRef snd        = deadLetter.Sender;
            IActorRef rcp        = deadLetter.Recipient;

            _count++;
            bool   done    = _maxCount != int.MaxValue && _count >= _maxCount;
            string doneMsg = done ? ", no more dead letters will be logged" : "";

            if (!done)
            {
                var rcpPath = rcp == ActorRefs.NoSender ? "NoSender" : rcp.Path.ToString();
                var sndPath = snd == ActorRefs.NoSender ? "NoSender" : snd.Path.ToString();

                _eventStream.Publish(new Info(rcpPath, rcp.GetType(),
                                              string.Format("Message {0} from {1} to {2} was not delivered. {3} dead letters encountered.{4}",
                                                            deadLetter.Message.GetType().Name, sndPath, rcpPath, _count, doneMsg)));
            }
            if (done)
            {
                ((IInternalActorRef)Self).Stop();
            }
            return(true);
        }
Beispiel #2
0
        private string GetActorType(IActorRef actor)
        {
            object props;

            if (IsField(actor))
            {
                props = actor.GetType().GetField("Props", bindingFlags).GetValue(actor);
            }
            else if (IsProp(actor))
            {
                props = actor.GetType().GetProperty("Props", bindingFlags).GetValue(actor);
            }
            else
            {
                return(null);
            }

            var type = props.GetType().GetProperty("TypeName", bindingFlags).GetValue(props);

            return(type.ToString().Split(',')[0]);
        }
Beispiel #3
0
        private void LogDeadLetter(object message, IActorRef snd, IActorRef recipient, string doneMsg)
        {
            var origin = ReferenceEquals(snd, Context.System.DeadLetters) ? "without sender" : $"from {snd.Path}";

            _eventStream.Publish(new Info(
                                     recipient.Path.ToString(),
                                     recipient.GetType(),
                                     $"Message [{message.GetType().Name}] {origin} to {recipient.Path} was not delivered. [{_count.ToString()}] dead letters encountered{doneMsg}. " +
                                     $"If this is not an expected behavior then {recipient.Path} may have terminated unexpectedly. " +
                                     "This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' " +
                                     "and 'akka.log-dead-letters-during-shutdown'."));
        }
Beispiel #4
0
 private bool IsProp(IActorRef actor)
 {
     return(actor.GetType().GetProperty("Props", bindingFlags) != null);
 }
Beispiel #5
0
 private bool IsField(IActorRef actor)
 {
     return(actor.GetType().GetField("Props", bindingFlags) != null);
 }