-
java callback 을 ZIO 로 바꾸기zio/zio2 2022. 7. 17. 17:04
문제
https://wefree.tistory.com/199 에서는 java callback 를 scala Future 로 바꾸었다.
이번에는 ZIO.asyncZIO() 를 이용해 ZIO 로 변경해 보자.
https://wefree.tistory.com/199 와 동일하게 java Async Http Client 의 callback 을 살펴보자.
val asyncHttpClient = org.asynchttpclient.Dsl.asyncHttpClient() val listenableFuture = asyncHttpClient.prepareGet("https://api.agify.io/?name=meelad").execute() val listener = new Runnable { override def run(): Unit = { val body: String = listenableFuture.get().getResponseBody(scala.io.Codec.UTF8.charSet) println(body) } } listenableFuture.addListener(listener, null) Thread.sleep(3000) asyncHttpClient.close()
코드
import org.asynchttpclient.AsyncHttpClient import zio._ object ZioApp extends zio.ZIOAppDefault { val asyncHttpClient: ZIO[Scope, Throwable, AsyncHttpClient] = ZIO.acquireRelease( ZIO.attempt(org.asynchttpclient.Dsl.asyncHttpClient()) )(x => ZIO.attempt(x.close()).ignore) val response: ZIO[Scope, Throwable, String] = ZIO.asyncZIO { cb => val listenableFuture = asyncHttpClient.map( _.prepareGet("https://api.agify.io/?name=meelad").execute() ) listenableFuture.map { lf => lf.addListener( () => { val body: String = lf.get().getResponseBody(scala.io.Codec.UTF8.charSet) cb(ZIO.succeed(body)) }, null ) } } def run = for { r <- response _ <- Console.printLine(r) } yield () }
설명
ZIO.asyncZIO() 코드를 살펴보면, https://wefree.tistory.com/199 와 비슷하게 내부적으로 ZIO Promise 를 사용한 것을 알 수 있다.
'zio > zio2' 카테고리의 다른 글
Ref vs Ref.Synchronized (0) 2022.12.09 Fiber (0) 2022.11.23 Error Models (0) 2022.11.20 Option 처리하기 (0) 2022.11.20 ZLayer 를 이용한 dependency injection (0) 2022.07.27