当前位置: 首页 > 知识库问答 >
问题:

在其他参与者之间共享一个参与者

云鸿祯
2023-03-14

我有一个AKKA模型,有一个主管演员,他创造了许多儿童演员。子参与者将处理一个事件并将消息发送到另一个服务(例如Kafka topic)。

目前,我有一个静态共享类,它在子参与者之间共享以发送消息,但在参与者模型中,我认为最好使用参与者来实现这一目的。

我想知道我如何才能创造一个演员,儿童演员可以分享它。如果supervisor actor创建了MessagePublisher actor,那么孩子们能找到一个将消息发送给它的角色吗?

非常感谢。

共有1个答案

龚德本
2023-03-14

根据用例的不同,您可以在顶层创建共享的Actor,也可以作为您的主管的子Actor。然后,您只需使用消息或构造函数将ActorRef传递给主管/子参与者,并将其保持为Actor内部状态。

下面的代码应该对其进行说明(它是Scala,但将其转换为Java应该非常容易)。

package test

import akka.actor.Actor.Receive
import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import akka.stream.ActorMaterializer

object TestClass extends App {

    implicit val system = ActorSystem( "ActorSystem" )

    implicit val executor = system.dispatcher

    implicit val materializer = ActorMaterializer( )

    //Option 1 Create as top level actor and pass to supervisor with init message
    val sharedActor: ActorRef = system.actorOf( Props[ SharedActor ] )

    val supervisor: ActorRef = system.actorOf( Props[ SupervisorActor ] )
    supervisor ! InitWithSharedActor( sharedActor )

    supervisor ! "NoArgsChild"
    supervisor ! "ArgsChild"

    class SupervisorActor extends Actor {
            private var sharedActor: Option[ ActorRef ] = None

            override def preStart( ) = {
                    //Option 2 Init as child actor of supervisor
                    println( "Start Supervisor" )
                    sharedActor = Some( context.actorOf( Props[ SharedActor ] ) )
            }

            override def receive: Receive = {
                    case InitWithSharedActor( sa ) =>
                            sharedActor = Some( sa )
                    case "NoArgsChild" =>
                            //Pass to child actor in init msg
                            sharedActor.foreach( sa => context.actorOf( Props[ ChildActor ] ) ! InitWithSharedActor( sa ) )
                    case "ArgsChild" =>
                            //Pass to child with constructor
                            sharedActor.foreach( sa => context.actorOf( Props( new ChildActorWithArgs( sa ) ) ) )
            }
    }

    class SharedActor extends Actor {

            override def preStart( ) = {
                    println( "Start Shared Actor" )
            }

            override def receive: Receive = {
                    case _ =>
            }
    }

    class ChildActor extends Actor {
            private var sharedActor: Option[ ActorRef ] = None

            override def preStart( ) = {
                    println( "Start NoArg Child Actor" )
            }

            override def receive: Receive = {
                    case InitWithSharedActor( sa ) => sharedActor = Some( sa )
            }
    }

    class ChildActorWithArgs( sharedActor: ActorRef ) extends Actor {

            override def preStart( ) = {
                    println( "Start WithArg Child Actor" )
            }

            override def receive: Receive = {
                    case _ =>
            }
    }

    case class InitWithSharedActor( sharedActor: ActorRef )

}
 类似资料:
  • 我正在学习Akka,我正在努力寻找一个好的模式来在整个演员层次结构中共享一个单一的、有限的资源。 我的用例是,我有一个HTTP RESTendpoint,在任何时候,我只能同时连接到该endpoint10个连接。不同层次结构级别的不同参与者需要能够进行HTTP REST调用。我使用非阻塞I/O发出HTTP请求(AsyncHttpClient)。 显而易见的解决方案是让一个参与者负责这个REST资源

  • 正如我在akka规范中所读到的,它在actors中支持mdc。例如,我可以将unic信息放在mdc中,然后在actor中使用它。但是期货呢?akka是否提供了任何保证,即在actor中启动的未来将具有相同的mdc?另外,发送给其他参与者的消息呢?默认情况下是否复制了MDC? 注意事项 对我来说,这看起来很奇怪,我只能在一个参与者代码中使用MDC。

  • 例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确? 更新:基于@Tim answer的解决方案 更改类别: 测试:

  • 参与者可以使用API或命令行添加到参与者库中。 在你开始之前 在你执行这些步骤之前,你在业务网络定义中必须建模一个参与者,并将其部署为业务网络。 下面的过程显示了一个使用以下数字财产范例业务网络定义的参与者模型的示例:digitalproperty-network 请注意:如果你使用composer participant add命令添加参与者,请确保参与者的JSON陈述包裹在单引号中。 name

  • 我有3个表:,,。用户和池具有透视表,因为它们具有多对多关系。 权限条目仅由我手动创建。然后,每个池可以根据自己的用户认为合适的情况将权限分配给他们自己的用户。因此,用于将用户链接到权限的透视表需要同时具有和和 那么这个数据透视表是如何工作的呢?如何制作三向透视表? 编辑:我的问题基本上是在这里问的,没有令人满意的答案!

  • 如何将众多用户的指纹与其他Android设备共享?例如,我们不想使用指纹设备。我们想使用Android设备进行指纹控制。用户将在我们的应用程序中保存个人指纹,当用户在其他Android设备中使用我们的应用程序时,他们可以使用这些指纹登录吗?有可能吗?