Scala 使用tell构建restapi

Scala 使用tell构建restapi,scala,akka,Scala,Akka,我试图找到一种使用akka和akkahttp创建restapi的好方法。根据文档,请求/回复不是参与者间通信的最佳解决方案。所以我的问题是,如何使用tell实现类似于此片段的功能 for { randomNumber <- (actor1 ? GetRandomNumber).mapTo[Int] randomString <- (actor2 ? GetRandomString).mapTo[String] } yield s"Random Strin

我试图找到一种使用akka和akkahttp创建restapi的好方法。根据文档,请求/回复不是参与者间通信的最佳解决方案。所以我的问题是,如何使用tell实现类似于此片段的功能

for {
    randomNumber <- (actor1 ? GetRandomNumber).mapTo[Int]
    randomString <- (actor2 ? GetRandomString).mapTo[String]
  } yield s"Random String: $randomString, Random Number: $randomNumber"
用于{

randomNumber您可以将收集其他参与者响应的状态合并,并在完全提供时进行处理

在代码中解释这一点,请考虑下面的例子

case类状态(string:Option[string],int:Option[int])
类组合因子(stringActor:ActorRef,intActor:ActorRef)
扩展演员{
覆盖def receive:receive={case}
stringActor!“获取随机字符串”
intActor!“获取随机整数”
been(onMessage(State(string=None,int=None)))
}
私有def onMessage(状态:state):接收={
case msg:String=>
val newState=state.copy(string=Option(msg))
完全提供时(新状态)
context.been(onMessage(newState))
案例消息:Int=>
val newState=state.copy(int=Option(msg))
完全提供时(新状态)
context.been(onMessage(newState))
}
提供专用def时(状态:状态):单位={
if(state.string.nonEmpty&&state.int.nonEmpty){
//在这里处理状态
}
}
}
状态累积是在
上下文的帮助下发生的。变为
哪个

将演员的行为更改为新的“接收” (PartialFunction[Any,Unit])处理程序。替换上的当前行为 行为堆栈的顶部

请注意,如果您的参与者同时处理其他消息,那么行为切换将更复杂

如果您不想使用
context.been
私有变量状态:state
作为
组合因子的变量字段也可用于实现相同的结果


最后一点,请不要在非类型化的参与者中对消息使用基元类型。如果两个不同的参与者发送相同的基元类型,则代码很难理解,并且可能会出现问题。

此代码是假定在http路由内还是在另一个参与者内?您好,欢迎这样做!请阅读,和。请阅读@IvanStanislavciuc在另一个Actor中您是否需要从两个不同的Actor获取数据,并仅在两个Actor返回结果时才继续?@IvanStanislavciuc