토큰을 redis에 저장하고 redis non-blocking lib을 사용하여 가져옵니다. 이 라이브러리는 내가 사용하고있는 get api 호출에 대한 Future [Option [String]]을 반환합니다. 비동기로 유지하면서 흐름에서이를 처리하는 방법을 알 수 없습니다.재생 2.2.1 - 필터에서 비동기 호출 만들기
object TokenFilter extends Filter {
def apply(nextFilter: (RequestHeader) => Future[SimpleResult])
(requestHeader: RequestHeader): Future[SimpleResult] = {
import scala.concurrent.ExecutionContext.Implicits.global
implicit val system = ActorSystem("redis-Client")
implicit val executionContext = system.dispatcher
implicit val timeout = AkkaTimeout(2 seconds)
val accesstoken: Future[Option[String]] = RedisClientFactory.getRedisClient().get("key11")
val result = Await.result(accesstoken, 2 second)
result match {
case Some(v) =>
Logger.info("success with value " + v)
nextFilter(requestHeader)
case None =>
Logger.info("failure with None ")
Future.successful(Results.Forbidden)
}
}
}
나는 여기에 몇 가지 기본 개념을 누락하는 것 - 내가 차단 호출과 같이 Await.result 사용하여 소개하면 나는 그것을 작업을 얻을 수 있습니다. 모든 포인터는 크게 감사하겠습니다. 성공을 위해 nextFilter (requestHeader)를 호출해야합니다. Results.Forbidden이 반환됩니다.
다음은 입력 확인을하지 않는 시도입니다.
accesstoken map{ result =>
result match {
case Some(v) =>
Logger.info("success with value " + v)
nextFilter(requestHeader) //won't type check
case None =>
Logger.info("failure with None ")
Results.Forbidden
}
}