У меня есть две версии одной и той же программы. Один из них завернут в веб-приложение Spring, а другой представляет собой простое приложение Java. Эта программа использует библиотеку immudb4j, которая используется для связи с экземпляром ImmuDB.
Проблема
Эта программа состоит из метода, который неоднократно открывает сеанс с экземпляром ImmuDB, а затем сразу же закрывает его снова - очевидно, раньше это было нечто большее, но я сократил код до минимума, который все еще вызывает проблему.
Веб-версия Spring аварийно завершает работу на ImmuClient::openSession номер 19 или иногда 20, за следующим исключением:
Код: Выделить всё
io.grpc.StatusRuntimeException: RESOURCE_EXHAUSTED: gRPC message exceeds maximum size 4194304: 4784128
Почему версия Spring дает сбой, в то время как простая версия Java работает нормально?
После дальнейшего тестирования может оказаться, что эта проблема возникает из-за некоторой общей зависимости Spring Boot. и immudb4j. Сбой не происходит при использовании Spring Boot версии 3.3.0, только с версиями 3.3.1, 3.3.2 и 3.3.3.
Код
Обычная версия Java
Код: Выделить всё
public class Application {
private ImmuClient immuClient = ImmuClient.newBuilder()
.withServerUrl("localhost")
.withServerPort(3322)
.build();
public void openAndCloseSessionRepeatedly() {
int iteration = 1;
try {
while (true) {
immuClient.openSession("defaultdb", "immudb", "immudb");
immuClient.closeSession();
System.out.println("Iteration: " + iteration++);
}
} catch (Exception e) {
System.out.println("Crashed at request " + iteration + " due to:");
e.printStackTrace();
}
}
public static void main(String[] args) {
new Application().openAndCloseSessionRepeatedly();
}
}
Код: Выделить всё
@SpringBootApplication
@RestController
public class Application {
private ImmuClient immuClient = ImmuClient.newBuilder()
.withServerUrl("localhost")
.withServerPort(3322)
.build();
@PostMapping
public void openAndCloseSessionRepeatedly() {
int iteration = 1;
try {
while (true) {
immuClient.openSession("defaultdb", "immudb", "immudb");
immuClient.closeSession();
System.out.println("Iteration: " + iteration++);
}
} catch (Exception e) {
System.out.println("Crashed at request " + iteration + " due to:");
e.printStackTrace();
}
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Требуется экземпляр ImmuDB. Я использую версию 1.5.0, поскольку именно она предположительно поддерживается immudb4j: https://github.com/codenotary/immudb/re ... tag/v1.5.0. Просто скачайте исполняемый файл и запустите его. Если предпочтительнее, существует также версия в Docker Hub.
Версия immudb4j для Maven, похоже, использует устаревшие зависимости (см. https://github.com/codenotary/immudb4j/issues/67). ), поэтому вам придется перезаписать их в POM-файле следующим образом:
Код: Выделить всё
io.codenotary
immudb4j
1.0.1
io.grpc
grpc-protobuf
1.55.1
io.grpc
grpc-netty
1.55.1
io.grpc
grpc-stub
1.55.1
Подробнее здесь: https://stackoverflow.com/questions/789 ... ted-grpc-m