Виртуальные потоки не используются в приложении Spring Boot 3.2, несмотря на конфигурацию

В настоящее время я работаю над приложением Spring Boot 3.2 с Java 21 и включил виртуальные потоки для повышения производительности. Однако я заметил, что многие потоки платформы все еще создаются, что противоречит преимуществам использования виртуальных потоков.

Вот фрагмент моего кода, в котором я использую RestClient для выполнения HTTP-запросов:

@RestController
@RequestMapping("weather")
public class WeatherController {

    @Autowired
    private final RestClient restClient;

    @GetMapping("{countryCode}")
    public Weather getWeather(@PathVariable String countryCode){
        return this.restClient.get()
                .uri("{countryCode}", countryCode)
                .retrieve()
                .body(Weather.class);
    }
}

@Configuration
public class ClientConfig {

    @Bean
    public RestClient weatherServiceClient(@Value("${weather.service.url}") String baseUrl) {
        return RestClient.builder()
                .baseUrl(baseUrl)
                .build();
    }
}

Я включил виртуальные потоки в своем приложении, но когда я проверяю его с помощью jvisualvm, я все равно вижу, что создается много потоков платформы (HttpClient Threads).

«Я замечаю, что многие потоки платформы все еще создаются» — Объясните. Как вы отслеживали количество потоков? Какое число вы считаете слишком большим? Вы понимаете, что для выполнения виртуальных потоков необходимо некоторое количество потоков платформы?

Basil Bourque 01.07.2024 06:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
171
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы гарантировать, что ваш RestClient использует виртуальные потоки, и решить проблему просмотра множества потоков платформы, вам необходимо настроить RestClient на использование исполнителя виртуальных потоков. По умолчанию RestClient использует пул потоков платформы для HTTP-запросов, поэтому вам необходимо переопределить это с помощью исполнителя виртуального потока.

Вот как вы можете настроить RestClient для использования виртуальных потоков:

@Configuration
public class ClientConfig {

    @Bean
    public RestClient weatherServiceClient(@Value("${weather.service.url}") String baseUrl) {
        return RestClient.builder()
                .baseUrl(baseUrl)
                .requestFactory(new JdkClientHttpRequestFactory(
                        HttpClient.newBuilder()
                                  .executor(Executors.newVirtualThreadPerTaskExecutor())  // Configure to use virtual threads
                                  .build()))
                .build();
    }
}

Другие вопросы по теме