Timelimiter still saves order after timeout in spring boot 6.2.2

30 Views Asked by At

I have a problem when studying Spring Cloud are orderRepository still saves order after timeout? What should I do to fix it? Thanks for your time.

bug image

my application.properties

my order controller

my order service

import com.micro.orderservice.dto.InventoryResponse; import com.micro.orderservice.dto.OrderLineItemsDto; import com.micro.orderservice.dto.OrderRequest; import com.micro.orderservice.model.Order; import com.micro.orderservice.model.OrderLineItems; import com.micro.orderservice.repository.OrderRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient;

import java.util.*; 
import java.util.stream.Collectors;

@Service 
@RequiredArgsConstructor 
@Slf4j 
@Transactional public class OrderService {

  private final WebClient.Builder webClientBuilder;

  private final OrderRepository orderRepository;

  public String placeOrder(OrderRequest orderRequest) {

    Set<OrderLineItems> orderLineItems = orderRequest.getOrderLineItemsDtos()
            .stream().map(this::mapToOrderLineItem).collect(Collectors.toSet());

    Order order = Order.builder()
            .orderNumber(UUID.randomUUID().toString())
            .orderLineItems(orderLineItems)
            .build();
    List<String> skuCodes = orderLineItems.stream().map(OrderLineItems::getSkuCode).toList();
    // call to inventory service
    InventoryResponse[] inventoryResponseArray = webClientBuilder.build().get()
            .uri("http://inventory-service/api/inventory",
                    uriBuilder -> uriBuilder.queryParam("skuCode", skuCodes).build())
            .retrieve()
            .bodyToMono(InventoryResponse[].class)
            .block();

    boolean allProductIsInStock = Arrays.stream(Objects.requireNonNull(inventoryResponseArray)).allMatch(InventoryResponse::getIsInStock);
    if (Boolean.TRUE.equals(allProductIsInStock)) {
        orderRepository.save(order);
        log.info("Order {} is placed!", order.getId());
        return "Order Placed Successfully";
    } else {
        throw new IllegalArgumentException("Product is not in stock, please try again later");
    }
}

  private OrderLineItems mapToOrderLineItem(OrderLineItemsDto orderLineItemsDto) {
    return OrderLineItems.builder()
            .skuCode(orderLineItemsDto.getSkuCode())
            .quantity(orderLineItemsDto.getQuantity())
            .price(orderLineItemsDto.getPrice())
            .build();
  }
}
0

There are 0 best solutions below