и я попытался использовать компоновщик в своем методе обслуживания, потому что изначально думал, что WebClient не является поточно-ориентированным (хотя на самом деле это так). Спасибо!
ел бы иметь http-клиент для вызова другого микросервиса из Spring Bootне реагирует применение. Из-за RestTemplate будет объявлен устаревшим, я попытался использовать WebClient.Builder и WebClient. Хотя я не уверен насчет безопасности потоков. Вот пример:
@Service
public class MyService{
@Autowired
WebClient.Builder webClientBuilder;
public VenueDTO serviceMethod(){
//!!! This is not thread safe !!!
WebClient webClient = webClientBuilder.baseUrl("http://localhost:8000").build();
VenueDTO venueDTO = webClient.get().uri("/api/venue/{id}", bodDTO.getBusinessOutletId()).
retrieve().bodyToMono(VenueDTO.class).
blockOptional(Duration.ofMillis(1000)).
orElseThrow(() -> new BadRequestException(venueNotFound));
return VenueDTO;
}
}
serviceMethod () в этом примере будет вызываться из нескольких потоков, а webClientBuilder - это единственный экземпляр компонента. Класс WebClient.Builder содержит state: baseUrl, и это, кажется, не является потокобезопасным, поскольку несколько потоков могут одновременно вызывать это обновление состояния. Между тем сам WebClient, кажется, является потокобезопасным, как упоминалось в ответе наПравильный способ использования Spring WebClient в многопоточной среде
Должен ли я использовать bean-компонент WebClient.Builder, как указано вhttps://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-webclient.html
Spring Boot создает и предварительно настраивает WebClient.Builder для вас; Настоятельно рекомендуется внедрить его в ваши компоненты и использовать его для создания экземпляров WebClient.
Один из вариантов обходного пути, который я вижу, - это создание WebClient без какого-либо состояния, передаваемого построителю, поэтому вместо:
WebClient webClient = webClientBuilder.baseUrl("http://localhost:8000").build();
Я сделаю:
WebClient webClient = webClientBuilder.build();
и передайте полный URL с протоколом и портом в вызове метода uri:
webClient.get().uri("full url here", MyDTO.class)
Как правильно использовать его в моем случае?