akka.net上发布的第一条消息最终陷入了死信队列,握手问题

问题描述

我遇到akka.net消息发送/发送问题,最终出现在死信队列中。 我使用Akka.Cluster.Tools.PublishSubscribe开发了一个基于集群的应用程序,其中两个ActorSystems都在同一台计算机的“ console.application”中运行。

我与一些演员一起启动了一个演员系统。然后我开始我的第二。应用程序,并在我初始化Actor系统后立即立即。我将第一条消息Mediator.Tell(new Publish(Topics.Backend.someName,new MyInitialMessage()))发布到主题所在的主题,接收主题的参与者在第一主题中托管。应用。 此消息始终总是死信队列中。

现在好了,我没有立即发送消息,而是将其延迟时间设置为例如5秒。然后可以正确传递邮件。 在我看来,这是一个握手问题。

问题:我如何找出第二个。演员系统已准备好接收任何消息?

我当前的解决方法是:我每秒基于MyInitialMessage发送调度程序,并等待第二个响应消息发送。应用。然后我知道我的第二。应用现已准备就绪,握手已完成。 但这在我看来只是一种解决方法。什么是解决此问题的合适方法

chris

解决方法

Akka.Cluster.Tools.PublishSubscribe在群集上工作。您需要等待集群初始化,然后才能发布任何消息。所有集群操作都封装在Cluster类中,该类可以使用Cluster.Get(actorSystem)从任何参与者系统创建。为了等待集群初始化:

  1. 您可以使用await cluster.JoinAsync(address,cancellationToken)以编程方式加入集群-您可以使用它来初始化种子节点(只需使actor系统加入其自身)和新节点。这将需要将HOCON配置中的种子节点留空。
  2. 如果要通过配置初始化集群(使用HOCON配置文件),则可以使用cluster.RegisterOnMemberUp(callback)注册一个回调函数,以将其余处理推迟到本地actor系统成功加入集群为止。

最快的方式(就性能和资源使用而言)是从特定参与者中订阅集群成员资格事件。实际上,这就是在引擎盖下实际实现上述其他解决方案的方式。

class MyActor : ReceiveActor 
{
    readonly Cluster cluster = Akka.Cluster.Cluster.Get(Context.System);
    public MyActor() 
    {
        Receive<ClusterEvent.MemberUp>(up => 
        {
            if (up.Member.Address == cluster.SelfAddress) 
            {
                Become(Ready);
            }
        });
    }

    protected override void PreStart() 
    {
        cluster.Subscribe(Self,new[]{ typeof(ClusterEvent.IMemberEvent) });
    }
    
    protected override void PostStop() 
    {
        // rember to unsubscribe once actor is stopping
        cluster.Subscribe(Self);
    }

    void Ready() 
    {
        // other receiver handlers
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...