Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Akka流和HTTP Scala:如何从路由向参与者发送消息_Scala_Actor_Akka Stream_Akka Http - Fatal编程技术网

Akka流和HTTP Scala:如何从路由向参与者发送消息

Akka流和HTTP Scala:如何从路由向参与者发送消息,scala,actor,akka-stream,akka-http,Scala,Actor,Akka Stream,Akka Http,我正在玩akka流和http实验版。到目前为止,我已经有了一个可以接受和响应HTTP请求的用户服务。我还将有一个预约服务,可以管理预约。要进行预约,必须是现有用户。如果用户存在,预约服务将与用户服务进行检查。现在,这显然可以通过HTTP完成,但我更希望约会服务向用户服务发送消息。作为新手,我不清楚如何使用actors(如akka httpabstracts)发送和接收消息。在中提到了ActorRef和ActorPublisher,但没有关于前者和后者的例子,这看起来像是对我的需求的过度使用。 我

我正在玩akka流和http实验版。到目前为止,我已经有了一个可以接受和响应HTTP请求的用户服务。我还将有一个预约服务,可以管理预约。要进行预约,必须是现有用户。如果用户存在,预约服务将与用户服务进行检查。现在,这显然可以通过HTTP完成,但我更希望约会服务向用户服务发送消息。作为新手,我不清楚如何使用actors(如
akka http
abstracts)发送和接收消息。在中提到了
ActorRef
ActorPublisher
,但没有关于前者和后者的例子,这看起来像是对我的需求的过度使用。 我的代码如下所示,并处于启用状态:

编辑: 我知道了如何发送消息,这可以通过
Source.actorRef
实现。只将消息发送到流中。我想做的是路由处理程序类接收响应。这样,当我创建约会服务时,它的参与者可以调用用户服务参与者并以与我的示例中的用户路由处理程序相同的方式接收响应。 伪代码:

val src=Source.single(name)\\如何将此消息发送给参与者并获得响应

编辑2: 根据@yardena的答案,我得出了以下结论,但最后一行没有编译。我的actor publisher返回一个
Future
,我猜它将被包装在
Promise
中,然后作为
Future
传递给路由处理程序

get {
  parameters("firstName".?, "lastName".?).as(FindByNameRequest) { name =>
    type FindResponse = Future[FindByNameResponse]

    val src: Source[FindResponse, Unit] = Source.actorPublisher[FindResponse](businessDelegateProps).mapMaterializedValue {
      _ ! name
    }
    val emptyResponse = Future.apply(FindByNameResponse(OK, Seq.empty))

    val sink = Sink.fold(emptyResponse)((_, response: FindResponse) => response)

    complete(src.runWith(sink)) // doesn't compile
  }
}
这个链接可能会有帮助:@Noah给出了这个答案

基本上你有两个选择: 1) 如果您想要一个“简单”的actor,它将接收到的所有消息转发到流中,那么可以使用Source.actorRef。然后,您可以通过使用mapAsync创建处理阶段,将消息管道化到UserService中。 2) 另一种选择是编写自己的ActorPublisher,以防您希望参与者有一些自定义行为


HTH

我最终使用了
Actor.ask
。简单。

将您的用户服务包装在参与者中,并通过向该参与者发送消息来进行服务调用。然后,您的约会服务(包装在另一个参与者中)也可以通过向包装它的用户参与者发送相同的消息来与用户服务交互。@Shadowlands这就是我打算做的。问题是我如何具体化并从路由向参与者发送消息?您能否展示从路线使用ActorRef的代码示例?不确定您正在努力解决的方面-您对Akka的其余部分有多熟悉?您可以很简单地调用一个actor,并使用类似于
myActorRef?myMessage
其中消息可以是任何不可变的类型(因此从
字符串到专门构建的案例类,例如
案例类UserByFirstNameRequest(firstName:String)
。例如。@Shadowlands你说的很明显。我试图理解的是,我的代码中的
UserReadResource
如何创建
源代码[T,ActorRef]
,然后将其具体化为
参与者
。看起来我必须使用
源代码.actorPublisher(Props)创建发布者
这里的道具将由
用户应用程序提供。快速浏览一下,您的第一个链接似乎很相关,它也在做我想做的事情。我会看一下并让您知道。
get {
  parameters("firstName".?, "lastName".?).as(FindByNameRequest) { name =>
    type FindResponse = Future[FindByNameResponse]

    val src: Source[FindResponse, Unit] = Source.actorPublisher[FindResponse](businessDelegateProps).mapMaterializedValue {
      _ ! name
    }
    val emptyResponse = Future.apply(FindByNameResponse(OK, Seq.empty))

    val sink = Sink.fold(emptyResponse)((_, response: FindResponse) => response)

    complete(src.runWith(sink)) // doesn't compile
  }
}