SpringBoot设置超时响应

当后端对于数据量较大的处理或是某些耗时的操作时,需要先对请求接口的请求进行响应。

  1. 配置接口,使用Call<V>进行返回
@GetMapping("test")
public Callable<BaseResponse> query() {
    return new Callable<BaseResponse>() {
        @Override
        public BaseResponse call() throws Exception {
            BaseResponse response = new BaseResponse(StatusCode.Success);
            try {
                response.setData("返回消息");
                Thread.sleep(10000);
                log.info("相应test接口");
            } catch (Exception e) {
                response = new BaseResponse(StatusCode.Fail.getCode(), e.getMessage());
            }
            return response;
        }
    };
}
  1. 增加配置
    在WebMvcConfigurer接口的实现类中进行配置
@Configuration
public class SysWebMvcConfigurer implements WebMvcConfigurer {

    @Bean
    public ContributorInterceptor contributorInterceptor(){
        return new ContributorInterceptor();
    }

    @Override
    public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(5 * 1000L);
        configurer.registerCallableInterceptors(timeoutInterceptor());
        configurer.setTaskExecutor(threadPoolTaskExecutor());
    }
    @Bean
    public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
        return new TimeoutCallableProcessingInterceptor();
    }

    @Bean("threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);//设置线程池中线程的个数
        executor.setMaxPoolSize(8);//设置线程池中可容纳线程的最大个数
        executor.setKeepAliveSeconds(10);//设置线程存活时间
        executor.setQueueCapacity(8);//设置等待处理的任务队列
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//设置超过最大线程数时需要执行的策略(等待策略)
        return executor;
    }
}

请求接口测试:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Spring Boot 3 中,可以使用 `WebFlux` 模块实现流式响应。要设置超时时间,可以在 `ServerHttpResponse` 对象上调用 `setWriteHandler()` 方法并传入一个 `java.util.function.Consumer` 对象。这个 Consumer 对象接受一个 `org.reactivestreams.Subscription` 对象和一个 `java.time.Duration` 对象,可以在其中设置超时时间。 以下是一个示例代码: ```java @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamData(ServerHttpResponse response) { return Flux.interval(Duration.ofSeconds(1)) .map(i -> "data " + i) .doOnSubscribe(subscription -> { response.setStatusCode(HttpStatus.OK); response.getHeaders().setContentType(MediaType.TEXT_EVENT_STREAM); response.setWriteHandler((outputStream) -> { Consumer<Tuple2<Subscription, Duration>> timeoutHandler = (t) -> { subscription.cancel(); try { outputStream.write("timeout".getBytes()); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } }; outputStream.onTimeout(Duration.ofSeconds(5), timeoutHandler); outputStream.onClose(() -> { subscription.cancel(); }); subscription.request(Long.MAX_VALUE); }); }); } ``` 在上面的代码中,我们使用 `Flux.interval()` 方法生成一个每秒钟产生一个递增数字的 Flux。然后,我们在 `doOnSubscribe()` 方法中设置响应头和写处理程序。在写处理程序中,我们设置了一个超时时间为 5 秒,并传入了一个超时处理程序。当超时发生时,我们取消订阅并向客户端发送 "timeout" 消息。如果客户端关闭连接,我们也会取消订阅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值