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
Scala 如何在akka actor中使用akka http cachedHostConnectionPool?_Scala_Akka_Akka Http - Fatal编程技术网

Scala 如何在akka actor中使用akka http cachedHostConnectionPool?

Scala 如何在akka actor中使用akka http cachedHostConnectionPool?,scala,akka,akka-http,Scala,Akka,Akka Http,akka http文档在中提到,我们不应该在actor的未来中使用access actor状态表单 相反,这应该是使用的模式: import akka.actor.Actor import akka.http.scaladsl.Http import akka.http.scaladsl.model._ import akka.stream.scaladsl.ImplicitMaterializer class Myself extends Actor with ImplicitMater

akka http文档在中提到,我们不应该在actor的未来中使用access actor状态表单

相反,这应该是使用的模式:

import akka.actor.Actor
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.scaladsl.ImplicitMaterializer

class Myself extends Actor
  with ImplicitMaterializer
  with ActorLogging {

  import akka.pattern.pipe
  import context.dispatcher

  val http = Http(context.system)

  override def preStart() = {
    http.singleRequest(HttpRequest(uri = "http://akka.io"))
      .pipeTo(self)
  }

  def receive = {
    case HttpResponse(StatusCodes.OK, headers, entity, _) =>
      log.info("Got response, body: " + entity.dataBytes.runFold(ByteString(""))(_ ++ _))
    case HttpResponse(code, _, _, _) =>
      log.info("Request failed, response code: " + code)
  }

}
在使用
cachedHostConnectionPool
时,我们应该做类似的事情吗

例:

如果是这样,我们为什么需要这样做?在文档中找不到解释 如果没有,正确的模式是什么


谢谢你

正如我在评论中提到的,如果你需要改变参与者的内部状态,你应该使用
pipeTo
未来的结果
发送回你自己进行处理。如果不这样做,您就有可能遇到并发修改该内部状态的问题,并失去使用参与者的好处。
Future
的完成后逻辑不会在参与者邮箱处理的上下文中执行,因此可能会与邮箱中的消息同时执行,从而导致潜在的并发问题。这就是为什么如果您需要在
未来
完成后改变状态,建议您通过管道返回到self


现在,如果以后没有状态管理器,那么您不必使用
pipeTo
,因为并发修改状态不会成为问题。

如果在将来完成后,您需要更改参与者的状态,那么可以,
pipeTo
是正确的做法,因为如果你不这样做,你可能会遇到并发的mod,从而失去参与者的利益。如果你不需要在未来结束后改变/处理状态,那么不,你不需要回到自我。非常感谢,你想把这作为一个答案吗?@NicholasJoseph,完成。
import akka.actor.Actor
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.scaladsl.ImplicitMaterializer

class Myself extends Actor
  with ImplicitMaterializer
  with ActorLogging {

  import akka.pattern.pipe
  import context.dispatcher

  var state = 10
  val http = Http(context.system)
  val pool = http.cachedHostConnectionPoolTls[Int](apiEndpoint.authority.host.toString())

  override def preStart() = {
    Source.single(HttpRequest(uri = "http://akka.io") -> 42)
      .via(poolClientFlow)
      .runWith(Sink.head)
      .pipeTo(self)
  }

  def receive = {
    case (res, ref) => ref match {
      case 42 => state -= 1 // Do something with the response 
    }
  }
}