【问题标题】:Functionalities between calling rpc methods调用 rpc 方法之间的功能
【发布时间】:2022-01-06 21:46:42
【问题描述】:

我正在尝试更改 ZIO 的 example code 以适应我想要的,但遇到了问题。我想在不同的 rpc 调用之间实现功能,但我似乎无法让它工作,因为在下面的示例中,只有 while 循环 rcpMethod3()rcpMethod4() 被执行,而 rcpMethod1()rcpMethod2()没有。

我想执行所有的rcpMethods 和 while 循环。

object Client extends App {
  val clientLayer: Layer[Throwable, ClientZLayer] =
  ClientZLayer.live(
    ZManagedChannel(
      ManagedChannelBuilder.forAddress("localhost", 8980).usePlaintext()
    )
  )
  
  // rcp methods
  def rcpMethod1(): ZIO[ClientZLayer with Console, Status, Unit] = {
    for {
      response <- ClientZLayer.rcpMethod1(Greeting("Hi"))
      _ <- putStrLn(s"""Greeted: "${response.name}".""")
    } yield ()
  }
  
  // Run the code
  final def run(args: List[String]) = {
    (for {
      _ <- rcpMethod1()
      _ <- rcpMethod2()
    } yield ()).provideCustomLayer(clientLayer).exitCode

    while(condition) {
      // bla bla
    }
  
    (for {
      _ <- rcpMethod3()
      _ <- rcpMethod4()
    } yield ()).provideCustomLayer(clientLayer).exitCode
  }
}

【问题讨论】:

    标签: scala client grpc rpc zio


    【解决方案1】:

    ZIO 数据类型是一种功能效果。功能效果是对工作流程的描述。这就是为什么我们在世界尽头有run 方法的原因。这个run方法执行提供的ZIO效果。

    所有rcpMethodN方法都是ZIO效果,所以它们只是对运行工作流的描述。如果您想按顺序运行这些效果,您应该使用for-comprehensionflatMap 组合它们,如下所示:

    for {
      _ <- rcpMethod1()
      _ <- rcpMethod2()
      _ <- rcpMethod3()
      _ <- rcpMethod4()
    } yield ()
    
    

    while(condition){ ... } 是您代码中的另一个错误。您应该使用 ZIO 数据类型引入这些循环结构。例如:

    for {
      _ <- rcpMethod1()
      _ <- rcpMethod2()
      _ <- ZIO.effect(???).repeatWhile(condition)
      _ <- rcpMethod3()
      _ <- rcpMethod4()
    } yield ()
    
    

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多