Java kotlin grpc.StreamObserver将委托给rx.PublishSubject

Java kotlin grpc.StreamObserver将委托给rx.PublishSubject,java,rx-java,kotlin,delegation,grpc,Java,Rx Java,Kotlin,Delegation,Grpc,每当我们声明流式api时使用GRPC时 rpc heartBeat(Empty) returns (stream ServiceStatus){} 我们为观察者模式提供了谷歌的简单界面StreamObserver(这是protobuf将为我们生成的) 现在我是Kotlin的新手,但我不知道使用现有的委派功能有没有办法使StreamObserver的主题委派? 在Kotlin中编写这段代码是否有更具表现力的方法?我将创建一个通用方法,该方法创建一个StreamObserver,将其传递给lamb

每当我们声明流式api时使用GRPC时

rpc heartBeat(Empty) returns (stream ServiceStatus){}
我们为观察者模式提供了谷歌的简单界面
StreamObserver
(这是protobuf将为我们生成的)

现在我是Kotlin的新手,但我不知道使用现有的委派功能有没有办法使StreamObserver的主题委派?
在Kotlin中编写这段代码是否有更具表现力的方法?

我将创建一个通用方法,该方法创建一个
StreamObserver
,将其传递给lambda参数,并将结果包装在
Observable

inline fun <T> asObservable(
    crossinline body: (StreamObserver<T>) -> Unit): Observable<T> {
  return Observable.create { subscription ->
    val observer = object : StreamObserver<T> {
      override fun onNext(value: T) {
        subscription.onNext(value)
      }

      override fun onError(error: Throwable) {
        subscription.onError(error)
      }

      override fun onCompleted() {
        subscription.onCompleted()
      }
    }
    body(observer)
  }
}
inlinefun可观察(
交叉线主体:(StreamObserver)->单位:可观察{
return Observable.create{subscription->
val observer=对象:StreamObserver{
覆盖下一个(值:T){
subscription.onNext(值)
}
覆盖错误(错误:可丢弃){
subscription.onError(错误)
}
覆盖未完成的乐趣(){
subscription.onCompleted()
}
}
机构(观察员)
}
}
然后,您可以通过以下方式实现RPC方法

override fun heartBeat(arg: Empty): Observable<ServiceStatus> =
    asObservable { asyncStub.heartBeat(arg, it) } 
override-fun-heartBeat(arg:Empty):可观察=
asObservable{asyncStub.heartBeat(arg,it)}

我将创建一个通用方法,该方法创建一个
StreamObserver
,将其传递给其lambda参数,并将结果包装在
可观察的

inline fun <T> asObservable(
    crossinline body: (StreamObserver<T>) -> Unit): Observable<T> {
  return Observable.create { subscription ->
    val observer = object : StreamObserver<T> {
      override fun onNext(value: T) {
        subscription.onNext(value)
      }

      override fun onError(error: Throwable) {
        subscription.onError(error)
      }

      override fun onCompleted() {
        subscription.onCompleted()
      }
    }
    body(observer)
  }
}
inlinefun可观察(
交叉线主体:(StreamObserver)->单位:可观察{
return Observable.create{subscription->
val observer=对象:StreamObserver{
覆盖下一个(值:T){
subscription.onNext(值)
}
覆盖错误(错误:可丢弃){
subscription.onError(错误)
}
覆盖未完成的乐趣(){
subscription.onCompleted()
}
}
机构(观察员)
}
}
然后,您可以通过以下方式实现RPC方法

override fun heartBeat(arg: Empty): Observable<ServiceStatus> =
    asObservable { asyncStub.heartBeat(arg, it) } 
override-fun-heartBeat(arg:Empty):可观察=
asObservable{asyncStub.heartBeat(arg,it)}

我创建了一个扩展函数,这样您就可以调用publishSubject.asGrpcObserver(),但我没有想到这样的解决方案,必须尝试一下……我之所以问这个问题,是因为我们可以在这里看到清晰的委托任务,而我不知道如何使用kotlins委托功能进行委托,因此,我认为这种情况不适用于委派?委派在这里不起作用,因为尽管
StreamObserver
observeable
有类似的方法,但它们的类型不同。并且您只能将调用委托给相同类型的实例。我不建议您在这里使用
主题
,因为
可观察的
在这里工作得很好。谢谢,我不知道交叉内联:)我创建了一个扩展函数,您可以调用publishSubject.asGrpcObserver(),但我没有想到这样的解决方案,我必须尝试一下…我之所以问这个问题,是因为我们可以在这里看到清晰的委托任务,而我不知道如何使用kotlins委托功能进行委托,因此,我认为这种情况不适用于委派?委派在这里不起作用,因为尽管
StreamObserver
observeable
有类似的方法,但它们的类型不同。并且您只能将调用委托给相同类型的实例。我不建议您在这里使用
主题,因为
可观察的
在这里工作得很好。谢谢,我不知道交叉内联:)