ZIO gRPC多RPC调用穿插自定义逻辑时部分方法未执行问题
问题原因
ZIO的效果是懒执行的,只有最终被返回给runtime调度的效果才会实际运行,你当前的三段逻辑互相独立:
- 第一段
rcpMethod1+rcpMethod2的逻辑仅创建了效果实例,没有被组合到最终返回的效果链里,runtime不会触发执行 - 中间的while是原生Scala同步代码,在run方法返回最终效果前直接同步执行
- 最后一段
rcpMethod3+rcpMethod4是run方法的返回值,所以能被runtime执行
修正方案
你需要把所有逻辑都整合为一个连贯的ZIO效果链,同步逻辑建议用ZIO的API包裹避免阻塞调度线程:
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 () } // rcpMethod2、rcpMethod3、rcpMethod4的实现同理保持不变 final def run(args: List[String]) = { (for { // 第一步执行rcp1、rcp2 _ <- rcpMethod1() _ <- rcpMethod2() // 第二步执行while逻辑,用ZIO.attempt包裹原生代码,如果内部有阻塞操作要加.blocking标记 _ <- ZIO.attempt { while(condition) { // 原有while里的业务逻辑 } } // 第三步执行rcp3、rcp4 _ <- rcpMethod3() _ <- rcpMethod4() } yield ()).provideCustomLayer(clientLayer).exitCode } }
内容的提问来源于stack exchange,提问作者Bassusour
相关产品推荐
相关产品推荐

