设置接口调用超时时间的N种办法

设置接口调用超时时间的N种办法

最近遇到调用ldap包接口需要设置接口超时时间,于是略微总结了一下java接口调用设置超时时间的方法:

1.在配置文件application.properties设置

springboot项目:
spring.mvc.async.request-timeout=20000,意思是设置超时时间为20000ms即20s

2.config配置类中设置

public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Override
public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {

	configurer.setDefaultTimeout(20000);
	configurer.registerCallableInterceptors(timeoutInterceptor());
}

@Bean
public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
		return new TimeoutCallableProcessingInterceptor();
	}
}

3.线程 future.get()中设置(重点)

本次遇到问题并非feign调用,而是本地接口调用,所以没法使用以上两种

3.1 线程池的创建
@Configuration
@Slf4j
public class CommonThreadPoolConfig {

    @Bean("asyncExecutor")
    public ThreadPoolTaskExecutor asyncExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数-可从配置文件获取方便更改
        executor.setCorePoolSize(2);
        //最大线程数
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors());
        //队列容量
        executor.setQueueCapacity(100);
        //设置非活跃线程的活跃时间(超时无任务则变为非活跃状态)
        executor.setKeepAliveSeconds(60);
        //设置线程名字
        executor.setThreadNamePrefix("asyncExecutor-");
        //设置拒绝策略
        executor.setRejectedExecutionHandler( new ThreadPoolExecutor.CallerRunsPolicy());
        //设置线程工厂
        executor.setThreadFactory(Executors.defaultThreadFactory());
        //等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);

        return executor;
    }
}
3.2 使用线程池
/**线程池**/
@Resource(name = "asyncExecutor")
private ThreadPoolTaskExecutor asyncExecutor;
3.3 调用远程接口
//调用接口
Future<Boolean> future = asyncExecutor.submit(()->ldapService.authenticateWithOutCache(authWithOutCacheReqDTO));
//设置超时时间
future.get(5,TimeUnit.SECONDS);
### Java 接口调用的方法及常见问题解析 #### 1. Java接口的概念及其基本特性 在 Java 编程语言中,接口是一种完全抽象的类,它定义了一组行为规范。任何实现了某个接口的类都必须提供该接口中所有方法的具体实现[^1]。如果一个类未完全实现接口中的方法,则该类需声明为抽象类。 以下是创建并使用接口的一个简单示例: ```java // 定义接口 public interface GreetingService { void sayGreeting(); } // 实现接口 public class EnglishGreeting implements GreetingService { @Override public void sayGreeting() { System.out.println("Hello!"); } } ``` #### 2. 调用第三方接口的方式 对于需要与外部服务交互的情况,通常涉及调用第三方 API 或 Web Service。这类操作可以通过 HTTP 请求完成,常见的库有 `HttpURLConnection` 和更高级别的框架如 Apache HttpClient 或 OkHttp[^2]。 以下是一个基于 `HttpURLConnection` 的 GET 请求示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpExample { public static String sendGetRequest(String urlStr) throws Exception { URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方式和其他属性 connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); // 连接超时时间设为5秒 connection.setReadTimeout(5000); // 数据读取超时时间为5秒 int responseCode = connection.getResponseCode(); // 获取响应码 if (responseCode == HttpURLConnection.HTTP_OK) { // 如果成功则获取数据流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder result = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { result.append(line).append("\n"); } reader.close(); return result.toString(); } else { throw new RuntimeException("HTTP request failed with code: " + responseCode); } } public static void main(String[] args) { try { String jsonResponse = sendGetRequest("https://jsonplaceholder.typicode.com/posts/1"); System.out.println(jsonResponse); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 3. 常见问题及解决方案 - **Q:** 如何处理网络异常? - A: 可以通过捕获 `IOException` 来应对连接失败或超时等问题,并设计重试机制提升可靠性。 - **Q:** 返回的数据格式不一致怎么办? - A: 使用 JSON 解析器(如 Jackson 或 Gson),将返回的内容映射到预定义对象模型中以便统一管理[^3]。 - **Q:** 性能较低如何优化? - A: 对于频繁使用的客户端实例考虑复用而非每次新建;同时启用缓存策略减少不必要的重复查询。 #### 4. 高级实践建议 为了简化复杂的 RESTful API 调用流程,推荐采用 Spring RestTemplate 或 Feign 等现代工具替代原始 HTTP 方法构建更加简洁优雅的服务端代码结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值