Ammad
Ammad

Reputation: 4225

Call back method to read header data stuck. Using Grpc JAVA

I am using Protoc 3.0 and have written call back method to read GRPC stream data using java.

@Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
            final MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {

        return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(
                next.newCall(method, callOptions)) {

            @Override
            public void start(Listener<RespT> responseListener, Metadata headers) {


                ClientCall.Listener<RespT> listener = new ClientCall.Listener<RespT>() {

                    @Override
                  public void onHeaders(Metadata headers) {
                        System.out.println("Header received" +headers);             
                        super.onHeaders(headers);

                    }

                };
                super.start(listener, headers);
            }
        };
    }
};

Now what i am seeing is that once i reach at onHeaders Metohd, program wait for indefinite period of time. Is this normal. How can i resume reading normal stream data once on header method is done?

EDIT-1 So Chaining will be like-

@Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
            final MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {

        return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(
                next.newCall(method, callOptions)) {

            @Override
        public void start(Listener<RespT> responseListener, Metadata headers) {

             responseListener = new SimpleForwardingClientCallListener<RespT>(responseListener) {

                  @Override
                  public void onHeaders(Metadata headers) {
                      System.out.println("Header found"+ headers);
                      super.onHeaders(headers);
                  }
             };


                ClientCall.Listener<RespT> listener = new ClientCall.Listener<RespT>() {

                    @Override
                  public void onHeaders(Metadata headers) {
                        System.out.println("Header received" +headers);             
                        super.onHeaders(headers);

                    }

                };
                super.start(listener, headers);
            }
        };
    }
};

Upvotes: 0

Views: 198

Answers (1)

Eric Anderson
Eric Anderson

Reputation: 26394

You are not chaining to responseListener. You should use SimpleForwardingClientCallListener for the listener, similar to what you are doing for the call.

@Override
public void start(Listener<RespT> responseListener, Metadata headers) {
    responseListener = new SimpleForwardingClientCallListener<RespT>(responseListener) {
    ...

Upvotes: 1

Related Questions