Для курса в моей степени бакалавра мне нужно настроить связь с RPC между 1 магистральным/контроллером и 3 работниками, использующими Thrift. Проблема, которую я имею сейчас, заключается в том, что, хотя переменные среды правильно устанавливаются для рабочих контейнеров, когда мастер отправляет запрос на Ping, он бросает исключение, в котором указывается, что правильная установленная переменная среды-NULL.
Изображения контейнеров создаются с использованием JIB.master | PORT: null
master | Exception in thread "main" java.lang.NumberFormatException: Cannot parse null string
master | at java.base/java.lang.Integer.parseInt(Unknown Source)
master | at java.base/java.lang.Integer.parseInt(Unknown Source)
master | at org.example.worker.Worker.start(Worker.java:137)
master | at org.example.worker.Main.main(Main.java:10)
database | Exception in thread "Thread-3" java.lang.NullPointerException: Cannot invoke "String.contains(java.lang.CharSequence)" because "inputLine" is null
database | at org.example.database.DatabaseServer$EchoClientHandler.run(DatabaseServer.java:57)
master exited with code 1
< /code>
docker-compose: < /p>
version: '3.9'
services:
master:
image: master-image:latest
container_name: master
build:
context: ./VS_Project/Master
dockerfile: ./Dockerfile
ports:
- '8080:8080'
environment:
network_mode: host
depends_on:
- worker_1
- worker_2
- worker_3
worker_1:
image: worker-image:latest
container_name: worker_1
build:
context: ./VS_Project/Worker
dockerfile: ./Dockerfile
ports:
- '8081:8080'
depends_on:
- database
environment:
- PORT=8081
worker_2:
image: worker-image:latest
container_name: worker_2
build:
context: ./VS_Project/Worker
dockerfile: ./Dockerfile
ports:
- '8082:8080'
depends_on:
- database
environment:
- PORT=8082
worker_3:
image: worker-image:latest
container_name: worker_3
build:
context: ./VS_Project/Worker
dockerfile: ./Dockerfile
ports:
- '8083:8080'
depends_on:
- database
environment:
- PORT=8083
< /code>
Master-код: < /p>
public void start() {
//RPC connection to worker
for(Map.Entry worker : workers.entrySet()) {
try {
TTransport transport;
transport = new TSocket(worker.getValue(), worker.getKey());
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
Calculator.Client client = new Calculator.Client(protocol);
System.out.print("Calling remote method...worker port:" + worker.getKey()); //e.g. Port 8081
client.ping();
System.out.println("done.");
transport.close();
} catch (TException e) {
e.printStackTrace();
}
}
< /code>
Код Worker: < /p>
public void start() {
assert (System.getenv("PORT") != null);
System.out.println("PORT: " + System.getenv("PORT"));
try {
serverTransport = new TServerSocket(Integer.parseInt(System.getenv("PORT")));
server = new TSimpleServer(new TServer.Args(serverTransport).processor(new Calculator.Processor(new CalculatorImpl())));
System.out.print("Starting the server... Port:" + System.getenv("PORT"));
server.serve();
System.out.println("done.");
}
catch (TTransportException e) {
e.printStackTrace();
stop();
}
}
Подробнее здесь: https://stackoverflow.com/questions/749 ... t-variable