/// <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); }
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]); }
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'.")); }
private bool IsProp(IActorRef actor) { return(actor.GetType().GetProperty("Props", bindingFlags) != null); }
private bool IsField(IActorRef actor) { return(actor.GetType().GetField("Props", bindingFlags) != null); }