小编Dav*_*ber的帖子

如何记录Akka HTTP客户端请求

我需要记录akka http客户端请求以及他们的响应.虽然似乎有一些用于记录这些请求的API,但没有关于如何完成这些请求的明确文档.我的方法是创建一个记录的请求,透明地包装Http().singleRequest(req)如下:

def loggedRequest(req: HttpRequest)
                  (implicit system: ActorSystem, ctx: ExecutionContext, m: Materializer): Future[HttpResponse] = {

  Http().singleRequest(req).map { resp ?
    Unmarshal(resp.entity).to[String].foreach{s ?
      system.log.info(req.toString)
      system.log.info(resp.toString + "\n" + s)
    }
    resp
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我必须通过解组或通过简单的请求来获取未来resp.entity.dataBytes,以便恢复响应的主体.我得到了日志记录但是承诺已经完成,我无法再将实体解组为实际数据.一个工作的解决方案将记录请求和响应并传递此测试用例,而IllegalStateException不会抛出"Promise already completed":

describe("Logged rest requests") {

  it("deliver typed responses") {
    val foo = Rest.loggedRequest(Get(s"http://127.0.0.1:9000/some/path"))
    val resp = foo.futureValue(patience)
    resp.status shouldBe StatusCodes.OK
    val res = Unmarshal(resp.entity).to[MyClass].futureValue
  }
}
Run Code Online (Sandbox Code Playgroud)

想法欢迎.

scala akka akka-http

27
推荐指数
2
解决办法
1万
查看次数

正确使用Akka http客户端连接池

我需要使用Akka的HTTP客户端(v2.0.2)来使用REST服务.逻辑方法是通过主机连接池执行此操作,因为我们期望大量的同时连接.在Flow此消耗(HttpRequest, T)和返回(Try[HttpResponse, T).该文件表明,一些任意类型T是需要管理的秩序回应潜在出请求,但没有指出什么主叫方应该使用返回的做T.

我的第一次尝试是使用Intas的下面的函数T.从许多地方调用它以确保连接使用单个池.

val pool = Http().cachedHostConnectionPool[Int]("127.0.0.1", 8888, ConnectionPoolSettings(system))

def pooledRequest(req: HttpRequest): Future[HttpResponse] = {
  val unique = Random.nextInt
  Source.single(req ? unique).via(pool).runWith(Sink.head).flatMap {
    case (Success(r: HttpResponse), `unique`) ? Future.successful(r)
    case (Failure(f), `unique`) ? Future.failed(f)
    case (_, i) ? Future.failed(new Exception("Return does not match the request"))
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是客户应该如何使用它T?有更清洁更有效的解决方案吗?最后,我的偏执是否可能无法实现偏执?

scala akka-http

15
推荐指数
2
解决办法
6172
查看次数

链接 Scala 部分函数的优雅方式

我正在寻找一种优雅的方式来链接从公共基类型派生的部分函数。这个想法是每个部分函数处理一个类型,所以它们很容易为不同的类型组合,如果链式部分函数未定义,则它们有一个共同的包罗万象:

trait Message
trait SysMessage extends Message
trait UserMessage extends Message

case class TextSysMessage(m: String) extends SysMessage
case class TextUserMessage(m: String) extends UserMessage

class Test {

  type MessagePF = scala.PartialFunction[Message, String]
  type SysMessagePF = scala.PartialFunction[SysMessage, String]
  type UserMessagePF = scala.PartialFunction[UserMessage, String]

  def getSysMessage: SysMessagePF = {
    case sm: TextSysMessage ? s"System message: ${sm.m}"
  }

  def getUserMessage: UserMessagePF = {
    case um: TextUserMessage ? s"User message: ${um.m}"
  }

  def * : MessagePF = {
    case m ? s"Unknown message: $m"
  } …
Run Code Online (Sandbox Code Playgroud)

scala

2
推荐指数
1
解决办法
1325
查看次数

如何在scala模式匹配的情况下确定catch的类型?

如果Scala中有模式匹配(case),例如:

foo match {
  case a: String => doSomething(a)
  case f: Float =>  doSomethingElse(f)
  case _ => ? // How does one determine what this was?
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确定实际捕获的类型?

scala case pattern-matching catch-all

0
推荐指数
1
解决办法
1321
查看次数

标签 统计

scala ×4

akka-http ×2

akka ×1

case ×1

catch-all ×1

pattern-matching ×1