需要多个(两个)jvm的最简单的应用程序



我有一个演员系统"Main"可能会永远运行下去。这个主角理解"快照"。或";Stop"消息(由我定义)。

我想创建一个bash脚本,当Main actor运行时,启动第二个(短暂的)系统,或actor,或任何东西,并向Main actor发送快照或停止消息。

在akka classic中,从第二个actor中选择actor非常容易

ActorRef mainActorRef = Await.result(system.actorSelection("akka.main.actor.path").resolveOne(timeout));
mainActorRef.send(new StopMessage() or new SnapsthotMessage());

在akka类型中有什么类似且同样容易的解决方案?

好的,让我们试着整理一下这堆乱七八糟的东西…首先,你的问题很不清楚:

在标题中,您请求基于两个jvm的东西,但在文本中,您请求">第二个(短期)系统,或actor,或任何"。不知道多jvm是必要的还是仅仅是解决这个问题的一个想法。此外,您的示例代码是在一个JVM中工作的东西(不考虑集群),并且您还只提到第二个">actor"在那里。

因此,如果需求是使用两个jvm,那么我建议更清楚地说明使用的方式、原因等。然后人们也可以为那部分提供实际的帮助。

现在,让我假设您只想要…

  1. A(类型化)演员系统
  2. …可以处理StopMessage/SnapshotMessage
  3. …这两个都可以从外部触发

您可以非常简单地使用通常的键入方式:

  1. 定义一个RootGuardian actor来接受这两个消息(这个actor基本上就是经典的隐式/user actor)——你必须为你的类型化actor系统这样做(因为要设置一个类型化actor系统,你需要提供RootGuardian的行为)。
  2. 让它创建所需的子角色来处理这些消息(在开始时或在需要时)。当然,在您的简单示例中,根守护程序本身也可以处理这些消息,但是只有一个参与者的actor系统并不是一个非常典型的用例。
  3. 让它将消息委托给合适的子角色
  4. 添加一个简单的api端点来调用system.tell ( ... )来将消息发送到系统中,您的RootGuardian actor将正确地委托它。
  5. 使用curl调用api端点(或使用任何其他方式与应用程序通信,有几十种,但大多数都不在akka本身的范围内)

作为一个一般的想法,Akka Typed倾向于更加严格地规定谁可以在哪里发送什么消息。在Akka经典中,基本上可以很容易地将所有内容发送到任何地方,并从任何地方(包括系统外)找到并访问任何参与者。不幸的是,这种"自由"导致大量的问题,因此在Typed中受到严格限制,这使得更清晰的契约和更好地定义消息流。

当然,在高度复杂的系统中,例如,您可能希望使用Receptionist来查找特定消息的目标参与者,但由于这个问题是针对简单的应用程序的,因此我现在将跳过它。

当然,你也可以添加一些方法来从系统外部获取你的actorref,例如通过使用Ask模式来实现RootGuardian中的actor发现,但是根本没有必要通过重新实现ActorSelection来规避Akka Typed的概念。

显然,你也可以使用集群,启动第二个JVM,将其连接到集群,发送消息并再次关闭它,但我们可以假设这将是过度的,并且非常非常慢(在启动应用程序时等待很长时间,连接到集群等,然后使用几毫秒来发送消息)。

如果你绝对想要第二个JVM,你当然可以,例如,创建一个简单的REST客户端来发送消息并启动它,但是…旋度存在,所以…对什么?

所以,tl;dr:"类似的,希望同样简单的解决方案";是system.tell( new StopMessage() );,它在akka类型中与您提供的akka经典代码基本相同。显然,以这种代码工作的方式实现参与者系统是(稍微)更棘手的部分。

相关内容

  • 没有找到相关文章

最新更新