【问题标题】:Akka.net ActorSystem.AwaitTermination triggers DeathWatchNotification when no messages are sentAkka.net ActorSystem.AwaitTermination 在没有消息发送时触发 DeathWatchNotification
【发布时间】:2016-02-04 02:25:55
【问题描述】:

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

[INFO][11/3/2015 7:21:06 PM][线程 0008][akka://TestActorSystem/user] 来自 akka://TestActorSystem/user 的消息 DeathWatchNotification 到 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
  • 安装框架 .NET 4.5.2
  • 控制台应用程序
  • 任何 CPU

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

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

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

【问题讨论】:

  • 除了在 Server 2012 R2 上,我在控制台中几乎看不到相同的设置。您是否配置了额外的日志记录?
  • 记录什么?完整的代码应用程序是 20 行代码,包括 5 个控制台输出。从 NuGet 检索时使用 Akka.net 的默认值。 Akka.net 显然有自己的日志记录,它提供了输出。 Server 20012 R2 不是环境的完整复制品,因此这可能与 Windows 10 相关,但这可能与其他人发布了类似的问题但没有说明他的环境但没有为他提供解决方案无关。 stackoverflow.com/questions/32386573/…
  • 我尝试在 Windows 10 机器上运行(在我提到的另一台机器上编译),它确实在该环境中打印了该消息。有趣的。它们的 CLR 版本略有不同,服务器 2012 R2 上的 4.0.30319.34209 与 Windows 10 上的 4.0.30319.42000。
  • 据我所知,版本的差异对应于 .NET Framework 4.5.2 和 4.6。
  • 是的,我的目标是 4.5,但我安装了 4.5.2,所以这是 Akka.net 中的错误吗?

标签: c# .net akka.net


【解决方案1】:

为防止出现此错误,您必须执行以下操作,直到他们将默认日志记录级别修复为 WARNING 应该在的位置。

将以下内容添加到您的应用配置中,INFO 日志消息将消失。 @Aaronontheweb 在错误报告中声明此消息“无需担心”。

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

【讨论】:

  • 对于那些对这个答案投反对票的人,你应该知道这是@aaronontheweb 通过我报告的错误对这个问题的官方解决方案。他们声称没有错误,并且您必须执行上述解决方案才能阻止 INFO 消息成为其企业级参与者框架的默认日志记录级别。随意在这里阅读它,我从源代码中获得了正确答案:github.com/akkadotnet/akka.net/issues/… 另外,我们鼓励您评论为什么您拒绝投票。
【解决方案2】:

您正在呼叫testActorSystem.Shutdown(); - 这将关闭ActorSystem。这会杀死所有参与者,包括内置系统参与者 - 所以DeathWatchNotifications 作为关闭和清理过程的一部分被触发。在这种情况下,您看到的消息是 /user 守护者 actor 正在自行关闭,但由于它正在关闭而无法传递。

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

【讨论】:

  • 正如我在报告的错误中所述,我仍然认为这是一个错误,并且您的默认日志记录级别为 INFO 而不是至少 WARNING。您提供的不是问题的解决方案,只是试图解释它。
  • @RodneyFoley 从另一个角度来看,您提供的也不是解决方案;)您想改变整个框架的行为——更重要的是可能会干扰使用 Akka.NET 的系统的可靠性生产 - 没有任何理由,除此之外,当应用程序停止时,您会收到您不理解的日志。
  • @Horsiath 真的吗?我提供的解决方案是我在他们的 GitHub 上的错误报告中提供的官方解决方案 aaronontheweb。这是他们声称不是错误的这个问题的官方解决方案。将企业框架从不是 INFO 日志记录而是 WARNING 或 ERROR 进行更改。理由是在我提交的官方错误中,有回应是 Java Akka 就是这样做的,所以我们也这样做了。根据 aaronontheweb 的说法,进行此更改应该不会影响任何生产环境,因为他声称每个人都已经在生产中更改了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多