пытается вернуть поток сообщений с помощью grp c, но возвращает только одно - PullRequest
0 голосов
/ 03 апреля 2020

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

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 rp c. Это метод в клиенте, который я использую для allCarParks:

 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> response;
             try {
                 response = blockingStub.allCarParks(request);
                 for (int i = 1; response.hasNext(); i++) {
                     carParkResponse cParkResponse = response.next();
                     allCarsArea.append(i + cParkResponse.getCarPark().toString());


                 }
             }catch(StatusRuntimeException e) {
                 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
                  return;
             }


     }

Пользователь должен ввести «статус» в текстовое поле, которое должно быть заполнено или заполнено пробелами. И затем ответьте, например, если пользователь наберет Full, он получит поток всех парковок, которые заполнены. Это метод на сервере:

public void allCarParks(allCarp rAllCarp, StreamObserver<carParkResponse> rStreamObserver) {
        ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();

            for(CarParkOperations.proto.cp.CarPark c : carList) {
                if(c.getStatus() == rAllCarp.getStatus()) {
                    continue;
                }
                carParkResponse response = carParkResponse.newBuilder().setCarPark(c).build();
                rStreamObserver.onNext(response);
            }
    }

В конце концов, это класс автомобиля, в котором я храню объект carPark:

package CarParkOperations.proto.cp;

import java.util.ArrayList;

import com.google.rpc.Status;


public class Car extends ArrayList<CarPark>{

    public static Car carparkCar;

    public static Car getInstance() {
        if(carparkCar == null) {
            carparkCar = new Car();
        }
        return carparkCar;

    }
    public Car() {
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(1).setStatus("Full").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(2).setStatus("Full").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(3).setStatus("Full").setLocation("Behind Building 4").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(4).setStatus("Full").setLocation("Behind Building 3").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(5).setStatus("Full").setLocation("Behind Building 2").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(6).setStatus("Full").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(7).setStatus("Full").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Full").setLocation("Behind Building 6").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Full").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());
        this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());     
    }
}

Как я уже говорил, все остальные методы работает нормально, поэтому я знаю, что это связано только с методами allCarParks, которые я создал. Это, наверное, очень очевидно, но я не могу этого увидеть. Я хочу, чтобы пользователь набрал Full в текстовое поле и получил все объекты парковки со статусом Full. Кроме того, allCarsArea именно там, где я отображаю данные. это JTextArea. Какие-либо предложения?

...