Akka.net ActorSystem.AwaitTermination在没有发送消息时触发DeathWatchNot

本文关键字:消息 DeathWatchNot ActorSystem net AwaitTermination Akka | 更新日期: 2023-09-27 18:20:22

此消息是在最简单的Akka.net示例应用程序中写入控制台的。

【信息】【2015年3月11日下午7:21:06】【线程0008】[akka://TestActorSystem/user]来自的消息死亡监视通知akka://TestActorSystem/user到akka://TestActorSystem/user未送达。1个死信遇到。

这是一个非常简单的代码,你所做的只是创建一个参与者,但你永远不会发送任何消息。

using System;
using Akka.Actor;
namespace AkkaNetTest {
    class Program {
        static void Main(string[] args) {
            ActorSystem testActorSystem = ActorSystem.Create("TestActorSystem");
            Console.WriteLine("Actor system 'TestActorSystem' created");
            IActorRef testActor = testActorSystem.ActorOf<TestActor>("Test");
            Console.WriteLine("Press a key to shutdown the 'TestActorSystem' actor system");
            Console.ReadKey();
            Console.WriteLine("Attempting to shutdown the actor system");
            testActorSystem.Shutdown();
            Console.WriteLine("Waiting for the actor system to terminate.");
            testActorSystem.AwaitTermination();
            Console.WriteLine("Actor system shutdown, press any key to exit");
            Console.ReadKey(); 
        }
    }
    public class TestActor : ReceiveActor { }
}

我运行的环境是:

  • Windows 10 RTM内部版本10240
  • Visual Studio 2013更新5
  • Akka.Net通过NeGet 1.0.4.12
  • 目标框架.NET 4.5
  • 安装framework.NET 4.5.2
  • 控制台应用程序
  • 任何CPU

当您运行这个简单的应用程序时,一旦进行ActorSystem.AwaitTermination()调用,就会出现上面的Akka.net输出。

它出现在我试图创建的所有Akka.net应用程序中,我能够在这个简单的应用程序中复制它。因此,如果我发送消息或不发送消息,总会发生这种情况。如果您注释掉IActorRef行,那么您将不会得到消息,因为没有创建任何参与者。

为什么会发生这种事,这没有任何意义。如果有人能帮助解释为什么会发生这种情况,以及如何在没有发送消息的情况下防止这种情况发生,我将不胜感激。

Akka.net ActorSystem.AwaitTermination在没有发送消息时触发DeathWatchNot

您正在调用testActorSystem.Shutdown();-这将关闭ActorSystem。这会杀死所有参与者,包括内置的系统参与者,因此DeathWatchNotification会作为关闭和清理过程的一部分被激发。在这种情况下,您看到的消息/user guardian actor正在关闭自己,但由于它正在关闭,因此无法传递。

正如文档所解释的,这不是一个bug,也没有什么可担心的:http://getakka.net/docs/concepts/message-delivery-reliability#dead-通常不令人担忧的字母

要防止此错误,您必须执行以下操作,直到他们将默认日志记录级别修复为WARNING(警告)。

将以下内容添加到您的应用程序配置中,INFO日志消息就会消失@Aaronontheeb在错误报告中表示,这条消息"没什么好担心的"。

<configuration>
  <configSections>
    <section name="akka"
             type="Akka.Configuration.Hocon.AkkaConfigurationSection, Akka" />
  </configSections>
  <akka>
    <hocon>
      <![CDATA[
          akka {
            loglevel = WARNING
          }
      ]]>
    </hocon>
  </akka>
</configuration>