В настоящее время я работаю над приложением 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).
Чтобы гарантировать, что ваш 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();
}
}
«Я замечаю, что многие потоки платформы все еще создаются» — Объясните. Как вы отслеживали количество потоков? Какое число вы считаете слишком большим? Вы понимаете, что для выполнения виртуальных потоков необходимо некоторое количество потоков платформы?