我遇到了一个akka.net消息send/Tell的问题,该消息最终出现在死信队列中。我使用Akka.Cluster.Tools.PublishSubscribe
开发了一个基于集群的应用程序,其中两个ActorSystems分别在同一台机器上的"console.application"中运行。
我用一些演员建立了一个演员系统。然后我开始我的第二次。应用程序和即时性在我初始化Actor系统后,我将第一条消息Mediator.Tell(new Publish(Topics.Backend.SomeName, new MyInitialMessage()))
发布到Topic,其中接收Actor托管在第1条中。应用此消息总是在死信队列中结束。
现在好,我没有立即发送消息,而是设置了一个延迟,例如5秒。然后可以正确地传递消息。在我看来,这是一个握手问题。
问题:我如何知道第二次。actor系统已准备好接收任何消息??
我目前的解决方法是:我每秒都会向调度程序发送一条MyInitialMessage,然后等待来自第二条的第一条响应消息。应用然后我知道我的第二个。应用程序现已准备就绪,握手已完成。但在我看来,这只是一种变通办法。这个问题的正确解决方案是什么?
chris
Akka.Cluster.Tools.PublishSubscribe
在集群上工作。您需要等待集群初始化,然后才能发布任何消息。所有集群操作都封装在cluster类中,该类可以使用Cluster.Get(actorSystem)
从任何参与者系统创建。为了等待集群初始化:
- 您可以通过使用await集群以编程方式加入集群。JoinSync(address,cancellyToken(-您可以使用它来初始化种子节点(只需使actor系统加入到自身(和新节点。这需要将HOCON配置中的种子节点留空
- 若您正在从配置初始化集群(使用HOCON配置文件(,则可以使用集群注册回调函数。RegisterOnMemberUp(回调(以推迟剩余的处理,直到本地参与者系统成功加入群集
(就性能和资源使用而言(最快的方法是从特定参与者中订阅集群成员身份事件。事实上,这就是上面描述的其他解决方案在后台实际实现的方式。
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
}
}