ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.