有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用ScheduledExecutorService延迟Spring WebClient调用不会等待响应

给定一个简单的REST控制器和服务方法(SpringBoot2.5.x和Java8),我如何实现以下目标

  1. 客户端将一些数据发布到REST控制器
  2. 控制器调用服务方法
  3. 服务方法应在固定延迟(例如10秒)后使用WebClient调用对外部API的REST调用

而1。二,。都是琐碎的,我挣扎着3。我的第一个实现是这样的,使用ScheduledExecutorService。这实际上延迟了sendNotification()的执行,但似乎忽略了这个REST调用的结果。如果外部API返回一个HTTP 4xx/5xx,我希望返回WebClientResponseException,但这不会发生

也许这与ScheduledExecutorService和一些线程问题有关

REST控制器类

@RestController
@RequiredArgsConstructor
public class ServiceController {

    private final SampleService sampleService;

    @PostMapping(value = "/api")
    public String create(@RequestBody SampleRequest sampleRequest) {
        return sampleService.create(sampleRequest);
    }
}

服务等级

@Service
@RequiredArgsConstructor
public class SampleService {

    private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

    public String create(SampleRequest sampleRequest) {
        final String result = processSampleRequest(sampleRequest);
        executorService.schedule(() -> sendNotification(), 10, TimeUnit.SECONDS);
        return result;
    }

    public void sendNotification() {
        final WebClient webClient = WebClient.builder()
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();
        webClient.post()
                .uri("http://localhost:5555")
                .body(BodyInserters.fromValue("some string"))
                .retrieve()
                .toBodilessEntity()
                .block();    
    }
}

共 (0) 个答案