gRPC Bid Streaming
gRPC Bidirectional Streaming Server and Client.
 
build.gradle
def grpcVersion = 'x.x.x'
dependencies {
    implementation 'org.hertsstack:herts-core:1.1.0'
    implementation 'org.hertsstack:herts-rpc:1.1.0'
    implementation 'org.hertsstack:herts-rpc-client:1.1.0'
    implementation "io.grpc:grpc-protobuf:${grpcVersion}"
    implementation "io.grpc:grpc-services:${grpcVersion}"
    implementation "io.grpc:grpc-stub:${grpcVersion}"
}
You can define interface of gRPC endpoint.
This interface uses by server and client.
Required @HertsRpcService and extends HertsService
※ Server Steaming Interface supports StreamObserver method only. Also, Required StreamObserver on method parameter
ServerStreamingService.java
import io.grpc.stub.StreamObserver;
@HertsRpcService(value = HertsType.BidirectionalStreaming)
public interface BidirectionalStreamingService extends HertsService {
    StreamObserver<Hoo> hoo(final StreamObserver<Hoo> responseObserver);
}
Implementation of Interface.
You should implement extends HertsServiceServerStreaming<T>. Generics is your interface.
UnaryServiceImpl.java
public class BidirectionalStreamingServiceImpl extends HertsServiceBidirectionalStreaming<BidirectionalStreamingService> implements BidirectionalStreamingService {
    
    @Override
    public StreamObserver<Hoo> hoo(final StreamObserver<Foo> responseObserver) {
        return new StreamObserver<Hoo>() {
            @Override
            public void onNext(Hoo hoo) {
                Foo foo = new Foo();
                foo.setName("I am foo");
                responseObserver.onNext(foo);
            }
            @Override
            public void onError(Throwable t) {
            }
            @Override
            public void onCompleted() {
                responseObserver.onCompleted();
            }
        };
    }
    
}
Start gRPC BidirectionalStreaming Server
public class Main {
  
    public static void main(String[] args) {
        // Inject other class if need it
        var service = new BidirectionalStreamingServiceImpl();
        HertsRpcServerEngine engine = HertsRpcServerEngineBuilder.builder()
                .registerHertsRpcService(service)
                .build();
        engine.start();
    }
}
Run server. Default port is 9999
java -jar {Your Jar path}
2023-06-15 13:18:35.747 INFO org.hertstack.rpc.ReflectMethod printMethodName BidirectionalStreamingService stats
2023-06-15 13:18:35.757 INFO org.hertstack.rpc.ReflectMethod printMethodName BidirectionalStreamingService/hoo
2023-06-15 13:18:35.946 INFO org.hertstack.rpc.HertsRpcServerEngineBuilder start Started Herts RPC server. gRPC type BidirectionalStreaming Port 9999
Start gRPC BidirectionalStreaming Client
public class Main {
  
    public static void main(String[] args) {
        HertsRpcClient client = HertsRpcClientBuilder
                .builder("localhost")
                .secure(false)
                .registerHertsRpcServiceInterface(BidirectionalStreamingService.class)
                .connect();
        BidirectionalStreamingService service = client.createHertsRpcService(BidirectionalStreamingService.class);
        
        var res = service.foo(new StreamObserver<Foo>() {
            @Override
            public void onNext(Foo res) {
                System.out.println(res.getName());
            }
            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
            }
            @Override
            public void onCompleted() {
                System.out.println("Completed");
            }
        });
        
        for (var i = 0; i < 10; i++) {
            Hoo hoo = new Hoo();
            hoo.setName("I am Hoo_" + i);
            res.onNext(hoo);
        }
        res.onCompleted();
    }
}
