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.
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();
}
}