当没有消息发送时,Akka.net ActorSystem.AwaitTermination触发DeathWatchNotification

时间:2015-11-03 19:33:25

标签: c# .net akka.net

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

  

[INFO] [11/3/2015 7:21:06 PM] [Thread 0008] [akka:// TestActorSystem / user]   消息来自akka:// TestActorSystem / user的DeathWatchNotification   akka:// TestActorSystem / user未交付。 1封死信   遇到。

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

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 build 10240
  •   
  • Visual Studio 2013 Update 5
  •   
  • Akka.Net via NeGet 1.0.4.12
  •   
  • 目标框架.NET 4.5
  •   
  • 安装框架.NET 4.5.2
  •   
  • 控制台应用程序
  •   
  • 任何CPU
  •   

运行此简单应用程序时,只要进行ActorSystem.AwaitTermination()调用,就会发生上述Akka.net输出。

它出现在我尝试创建的所有Akka.net应用程序中,并且我能够在这个简单的应用程序中重现它。因此,如果我发送消息或者我不发送消息,它总会发生。如果您注释掉IActorRef行,那么您将无法收到消息,因为没有创建的演员。

这没有任何意义,为什么会发生这种情况。如果任何人可以帮助解释为什么会发生这种情况以及如何防止它发生,即使没有发送过任何消息,那么我会很感激。

2 个答案:

答案 0 :(得分:1)

您正在呼叫testActorSystem.Shutdown(); - 这会关闭ActorSystem。这会杀死所有参与者,包括内置的系统参与者 - 因此DeathWatchNotification作为关闭和清理过程的一部分被触发。在这种情况下,您看到/ user监护人关闭自己的消息,由于它正在关闭而无法交付。

不是一个错误,没有什么可担心的,正如文档所解释的那样:http://getakka.net/docs/concepts/message-delivery-reliability#dead-letters-which-are-usually-not-worrisome

答案 1 :(得分:-2)

要防止出现此错误,您必须执行以下操作,直到将默认日志记录级别设置为“警告”为止。

将以下内容添加到您的应用配置中,INFO日志消息将消失。 @Aaronontheweb在错误报告中表示,这条消息是&#34;没有什么可担心的&#34;。

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