Собственная сборка Spring, не использующая виртуальные потоки
Я создаю несколько простых веб-приложений, в которых хочу использовать преимущества как встроенной компиляции, так и виртуальных потоков. На данный момент с помощью Spring-Boot 3.2.0 я могу создавать собственные исполняемые файлы или использовать преимущества виртуальных потоков, но не то и другое:
окружение:
uname -a
Linux kl-ubuntu 6.2.0-35-generic #35~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Oct 6 10:23:26 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
java -version
java version "21" 2023-09-19
Java(TM) SE Runtime Environment Oracle GraalVM 21+35.1 (build 21+35-jvmci-23.1-b15)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21+35.1 (build 21+35-jvmci-23.1-b15, mixed mode, sharing)
пример проекта:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>gvm_virtual_threads</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
единственный класс:
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
private final static Logger logger = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/greeting")
public String greet() {
logger.info("Inside greeting");
return "Hi!";
}
}
компиляция:
mvn clean -Pnative own: компиляция
выполнение jvm без виртуальных потоков и его использование
java -jar target/gvm_virtual_threads-0.0.1.jar &
curl localhost:8080/greeting
бревно:
2023-11-25T22:02:03.255-03:00 INFO 2580376 --- [nio-8080-exec-3] com.example.demo.DemoApplication : Inside greeting
выполнение jvm с виртуальными потоками и его использование
java -jar target/gvm_virtual_threads-0.0.1.jar --spring.threads.virtual.enabled=true &
curl localhost:8080/greeting
бревно:
2023-11-25T22:05:28.564-03:00 INFO 2580516 --- [omcat-handler-0] com.example.demo.DemoApplication : Inside greeting
Я вижу, что название темы изменилось сnio-8080-exec-3
кomcat-handler-0
Но с нативной компиляцией graalvm оба
./target/gvm_virtual_threads &
curl localhost:8080/greeting
и
./target/gvm_virtual_threads --spring.threads.virtual.enabled=true &
curl localhost:8080/greeting
регистрирует одно и то же имя потока:
2023-11-25T22:09:05.675-03:00 INFO 2580647 --- [nio-8080-exec-3] com.example.demo.DemoApplication : Inside greeting
Я знаю, что это не лучший способ проверить, включены ли виртуальные потоки, но при нагрузке на приложение и запросе показателей микрометра через привод я не вижу сниженияjvm_threads_peak_threads
на компиляциях graalvm, когда в компиляциях jvm есть.
Разве это не предполагаемый вариант использования? Я делаю что-то неправильно?
1 ответ
Установка изменяет bean-компоненты, находящиеся в контексте приложения. Предположения о закрытом мире обработки GraalVM и AOT не позволяют изменять bean-компоненты, находящиеся в контексте приложения, во время выполнения .
Чтобы использовать виртуальные потоки в собственном образе, установитеspring.threads.virtual.enabled=true
в вашейapplication.properties
файл, а затем создайте образ.