【问题标题】:I am at a loss of how to create an appropriate flow using webflux我不知道如何使用 webflux 创建适当的流程
【发布时间】:2018-10-21 07:31:20
【问题描述】:

问题说明:我有一个对 booking-service API 的 POST 请求,该 API 获取了 BookingRecord。我映射它以提取值,以便使用 WebClient 调用另一个 fare-service API。我从那个电话中收到了Mono<Fare>。我需要检查 BookingRecord 类型的 getFare() 方法的值是否与 WebClient 返回的 Fare 类型的 getFare() 相同。如果没有,我需要引发异常,并将其传递给调用者。这里 caller 是另一个微服务,ui-service 调用了 booking-service API(那么我应该如何处理这个问题,将错误传回或者最好的办法是什么?)否则我会保存新的 BookingRecord 并将该记录的 id 返回给调用者。最好的流程顺序是什么?我尽力而为,但没有取得多大成功,并将代码粘贴到此处。

public HandlerFunction<ServerResponse> book = request ->
    {
request.bodyToMono(BookingRecord.class)
        .map(br ->
        {
            this.webClient.get()
                    .uri("/fares/get/{flightNumber}/{flightDate}",
                         br.getFlightNumber(),
                         br.getFlightDate())
                    .retrieve()
                    .bodyToMono(Fare.class)
                    .map(f ->
                    {
                        if (!f.getFare()
                                .equals(br.getFare()))
                        {
                            throw new RuntimeException("Fare is tampered");
                        }
                        else
                        {
                            id = bookingRepository.save(br).getId();
                        }
                        return id;
                    })
                    .subscribe();
            return id;
        });

return ServerResponse.ok()
        .body(BodyInserters.fromObject(id));
};

【问题讨论】:

    标签: spring-webflux


    【解决方案1】:

    经过多次调整,这就是我所做的。希望这是正确的做法。 1. 我从票价服务本身引发 500 Http 错误,而不是签入预订服务。

    public HandlerFunction<ServerResponse> getFare = request ->
        {
            String flightNumber = request.pathVariable("flightNumber");
            String flightDate   = request.pathVariable("flightDate");
            String fare         = request.pathVariable("fare");
    
            Mono<ServerResponse> notFound = ServerResponse.notFound()
                    .build();
    
            return Mono
                    .justOrEmpty(faresRepository.getFareByFlightNumberAndFlightDateAndFare(flightNumber,
                                                                                           flightDate,
                                                                                           fare))
                    .flatMap(f -> ServerResponse.ok()
                            .contentType(APPLICATION_JSON)
                            .body(fromObject(f)))
                    .switchIfEmpty(notFound);
        };
    
    1. 在预订服务中使用 onStatus() 方法处理异常

      public HandlerFunction<ServerResponse> book = request ->
      {
      
          logger.info("Inside Book function");
          return request.bodyToMono(BookingRecord.class)
                  .flatMap(br ->
                  {
                      logger.info("Calling fare-service");
                      return this.webClient.get()
                              .uri("/fares/get/{flightNumber}/{flightDate}/{fare}",
                                   br.getFlightNumber(),
                                   br.getFlightDate(),
                                   br.getFare())
                              .retrieve()
                              .onStatus(HttpStatus::isError,
                                        x -> Mono
                                                .error(new RuntimeException("Fare has been tampered with!!")))
                              .bodyToMono(Fare.class);
      
                  })
                  .map(fare ->
                  {
                      logger.info("Saving a BookingRecord");
                      BookingRecord br = new BookingRecord();
                      br.setFlightNumber(fare.getFlightNumber());
                      br.setFlightDate(fare.getFlightDate());
                      br.setFare(fare.getFare());
      
                      long id = bookingRepository.save(br)
                              .getId();
      
                      return id;
                  })
                  .flatMap(id -> ServerResponse.ok()
                          .body(BodyInserters.fromObject(id)));
      };
      

    这样,我获得了票价篡改异常或获取成功数据库保存的 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多