Можно сделать только один запрос grp c, после чего приложение зависает - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь реализовать клиент и сервер, используя grp c. Когда я отправляю запрос на сервер, я получаю ответ, но когда я пытаюсь отправить другой запрос, приложение останавливается или просто постоянно говорит, что ищет запрашиваемый товар. Я очень новичок в этом, поэтому не знаю, что происходит. это методы, которые я реализовал на своем сервере:

package CarParkOperations.proto.cp;

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Logger;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java.util.Collection;

public class CarParkService extends carParkServiceGrpc.carParkServiceImplBase{
    private static final Logger logger = Logger.getLogger(CarParkService.class.getName());



     private Server server;

     private void start() throws IOException {
            /* The port on which the server should run */
            int port = 3000;

            server = ServerBuilder.forPort(port)
                .addService(new CarParkService())
                .build()
                .start();

            logger.info("Server started, listening on " + port);

            Runtime.getRuntime().addShutdownHook(new Thread() {
              @Override
              public void run() {
                System.err.println("*** shutting down gRPC server since JVM is shutting down");
                CarParkService.this.stop();
                System.err.println("*** server shut down");
              }
            });
          }

          private void stop() {
            if (server != null) {
              server.shutdown();
            }
          }

          /**
           * Await termination on the main thread since the grpc library uses daemon threads.
           */
          private void blockUntilShutdown() throws InterruptedException {
            if (server != null) {
              server.awaitTermination();
            }
          }

          /**
           * Main launches the server from the command line.
           */
          public static void main(String[] args) throws IOException, InterruptedException {
            final CarParkService server = new CarParkService();
            server.start();
            server.blockUntilShutdown();
          }

    public void showStatus(carparkRequest request, StreamObserver<carParkResponse> rStreamObserver) {
        for(CarParkOperations.proto.cp.CarPark c : Car.getInstance()) {
            if(c.getCarParkId() == request.getCarParkId()) {
                carParkResponse response = carParkResponse.newBuilder().setCarPark(c).build();
                rStreamObserver.onNext(response);
                rStreamObserver.onCompleted();
                return;
            }
        }   
    }

    @Override
    public void allCarParks(allCarp rAllCarp, StreamObserver<carParkResponse> rStreamObserver) {
        ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
        for (CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
            carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
                if(car.getStatus() == rAllCarp.getStatus()) {
                    rStreamObserver.onNext(response);
                }
        }
        rStreamObserver.onCompleted();
    }

    public void setFull(CarParkToUpdateRequest request, StreamObserver<carParkResponse> rStreamObserver) {
        ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
            for(CarParkOperations.proto.cp.CarPark c : carList) {
                if(c.getCarParkId() == request.getDeviceId()) {
                    Car.carparkCar.clear();
                    Car.carparkCar.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(c.getCarParkId()).setLocation(c.getLocation()).setStatus("Full").build());
                    for(CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
                        carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
                        rStreamObserver.onNext(response);
                        rStreamObserver.onCompleted();
                        return;
                    }
                }
            }
    }
    public void setSpaces(CarParkToUpdateRequest request, StreamObserver<carParkResponse> rStreamObserver) {
        ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
        for(CarParkOperations.proto.cp.CarPark c : carList) {
            if(c.getCarParkId() == request.getDeviceId()) {
                Car.carparkCar.clear();
                Car.carparkCar.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(c.getCarParkId()).setLocation(c.getLocation()).setStatus("Spaces").build());
                for(CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
                    carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
                    rStreamObserver.onNext(response);
                    rStreamObserver.onCompleted();
                    return;
                }
            }
        }   
    }

}

Это методы, которые я реализовал на своем клиенте:

     public void showStatus(int id) {
          channel =ManagedChannelBuilder.forAddress("localhost", 3000)
                    // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                    // needing certificates.
                    .usePlaintext()
                    .build();
          blockingStub = carParkServiceGrpc.newBlockingStub(channel);
            asyncStub = carParkServiceGrpc.newStub(channel);
             logger.info("Will try to get CarPark " + id + " ...");
             carparkRequest request = carparkRequest.newBuilder().setCarParkId(id).build();
             carParkResponse response;
             try {
                 response = blockingStub.showStatus(request);
             }catch(StatusRuntimeException e) {
                 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
                  return;
             }finally {
                channel.shutdown();
            }
             logger.info("Carpark: " + response.getCarPark());
            statusArea.append(response.getCarPark().toString());
     }





     public void setFull(int id) {
          channel =ManagedChannelBuilder.forAddress("localhost", 3000)
                    // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                    // needing certificates.
                    .usePlaintext()
                    .build();
          blockingStub = carParkServiceGrpc.newBlockingStub(channel);
          asyncStub = carParkServiceGrpc.newStub(channel);
             logger.info("Will try to get CarPark " + id + " ...");
             CarParkToUpdateRequest request = CarParkToUpdateRequest.newBuilder().setDeviceId(id).build();
             carParkResponse response;
             try {
                 response = blockingStub.setFull(request);
             }catch(StatusRuntimeException e) {
                 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
                  return;
             }finally {
                channel.shutdown();
             }
             logger.info("Carpark: " + response.getCarPark());
             fullArea.append(response.getCarPark().toString());
     }





     public void allCarParks(String status) {
         channel =ManagedChannelBuilder.forAddress("localhost", 3000)
                    // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                    // needing certificates.
                    .usePlaintext()
                    .build();
            blockingStub = carParkServiceGrpc.newBlockingStub(channel);
            asyncStub = carParkServiceGrpc.newStub(channel);
             logger.info("Will try to get CarPark " + status + " ...");

             allCarp request =
                     allCarp.newBuilder().setStatus(status).build();
            Iterator<carParkResponse> carResponse;
            try {
                carResponse = blockingStub.allCarParks(request);
              for (int i = 1; carResponse.hasNext(); i++) {
                  carParkResponse carResponse1 = carResponse.next();
                  info("Result #" + i + ": {0}", carResponse1);
                if (testHelper != null) {
                  testHelper.onMessage(carResponse1);
                }
              }
            } catch(StatusRuntimeException e) {
                 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
                  return;
            }
          }
     public void setSpaces(int id) {
          channel =ManagedChannelBuilder.forAddress("localhost", 3000)
                    // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                    // needing certificates.
                    .usePlaintext()
                    .build();
          blockingStub = carParkServiceGrpc.newBlockingStub(channel);
            asyncStub = carParkServiceGrpc.newStub(channel);
             logger.info("Will try to get CarPark " + id + " ...");
             CarParkToUpdateRequest request = CarParkToUpdateRequest.newBuilder().setDeviceId(id).build();
             carParkResponse response;
             try {
                 response = blockingStub.setSpaces(request);
             }catch(StatusRuntimeException e) {
                 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
                  return;
             }finally {
                    channel.shutdown();
                }
             logger.info("Carpark: " + response.getCarPark());
             spacesArea.append(response.getCarPark().toString());
     }

И это файл протока:

syntax = "proto3";

package CarParkOperations;

option java_package = "CarParkOperations.proto.cp";
option java_multiple_files = true;
option java_outer_classname = "ClassName";

service carParkService{
rpc showStatus(carparkRequest) returns (carParkResponse) {};
rpc setFull(CarParkToUpdateRequest) returns (carParkResponse){};
rpc setSpaces(CarParkToUpdateRequest) returns (carParkResponse){};
rpc allCarParks(allCarp) returns (stream carParkResponse){};
}

message CarPark{
int32 carPark_id = 1;
string status =2;
string location =3;

}

message carparkRequest{
int32 carPark_id = 1;
}

message CarParkToUpdateRequest {
 int32 device_id = 1;
}
message allCarp{
string status = 1;
}


message carParkResponse{
CarPark carPark =1;
}

Как я уже сказал, я могу получить отклик, когда заполняю правильный запрос (за исключением метода allCarParks, но это отдельная проблема), но при попытке сделать другой запрос застревает. Я могу отправить второй ответ нечетное время, но это так. Я просто хочу знать, где я иду не так. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 апреля 2020

В вашей реализации на стороне сервера onNext () и onCompleted () вызывать не всегда, например, когда список пуст или какое-то условие не выполняется, это ошибка.

...