java测试链接超时返回前端

简介: java测试链接超时返回前端

有时候代码需要连接数据库或者svn,连接时间并不长,但是前端调用接口超时的时间一般是一分钟,生产环境的情况下不会让用户等待一分钟,就需要后端控制接口超时时间,例子如下

原理

在Java中,超时返回的原理通常是通过使用多线程和并发编程实现的。具体来说,超时返回的实现方式可以是通过设置线程的超时时间,在超过该时间后中断线程的执行并返回一个超时异常。

以下是一个简单的示例代码,演示了如何在Java中实现超时返回:

public class TimeoutExample {  
    public static void main(String[] args) {  
        // 创建一个线程池,只包含一个线程  
        ExecutorService executor = Executors.newSingleThreadExecutor();  
          
        // 提交一个任务到线程池,并设置超时时间为3秒钟  
        Future<?> future = executor.submit(() -> {  
            // 模拟一个耗时操作,持续5秒钟  
            try {  
                Thread.sleep(5000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("任务执行完成");  
        });  
          
        try {  
            // 获取任务的结果,如果在3秒钟内任务没有执行完成,就会抛出一个TimeoutException异常  
            future.get(3, TimeUnit.SECONDS);  
        } catch (TimeoutException e) {  
            System.out.println("任务执行超时");  
            // 取消任务的执行  
            future.cancel(true);  
        } catch (InterruptedException | ExecutionException e) {  
            e.printStackTrace();  
        } finally {  
            // 关闭线程池  
            executor.shutdown();  
        }  
    }  
}

在这个示例中,我们创建了一个单线程的线程池,并提交了一个任务到线程池中执行。我们还设置了超时时间为3秒钟,如果在3秒钟内任务没有执行完成,就会抛出一个TimeoutException异常。在catch块中,我们捕获了这个异常,并取消了任务的执行。最后,我们还关闭了线程池。

需要注意的是,在实际应用中,超时返回的实现方式可能会更加复杂和多样化,需要根据具体的业务场景和需求进行设计和实现。同时,还需要注意并发编程中可能存在的竞争条件和死锁等问题,以保证程序的正确性和可靠性。

方案

第一个例子

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * java实现超时返回
 * 到了规定时间,不管有没有执行结果,我都要响应前端
 *
 * @author xudong.shen
 * @date 2022/03/23
 */
public class ThreadTest {

    public static void main(String[] args) {
        Callable<String> task = () -> {
            //设置执行响应时间的方法体
            String str = ThreadTest.sleepJavaTest();
            System.err.println("不论执行多久,我都在等着打印结果:"+str);
            return str;
        };

        ExecutorService exeservices = Executors.newSingleThreadExecutor();
        Future<String> future = exeservices.submit(task);
        try {
            //设置我最多等 5s,5s后无论如何我都要响应前端
            String result = future.get(1, TimeUnit.SECONDS);
            System.err.println("我在规定时间内返回SUCCESS啦:"+result);
        } catch (Exception e) {
            e.printStackTrace();
            //异常处理的方法
            System.err.println("我在规定时间内没返回FAIL呢:这里是异常处理的方法");
        }
    }

    public static String sleepJavaTest() {

        try {
            /*java中sleep与wait的区别
             * 对于sleep方法导致程序暂停执行指定的时间,让出cpu给其他线程。但是它的监控状态依然保持,时间到了就会恢复。
             * 在sleep方法中,线程不会释放对象锁。
             * 对于wait方法,线程会放弃对象锁,进入等待次对象的等待锁定池,
             * 只有针对此对象调用notify()后,本线程才进入对象锁定池的准备。
             *
             * 假设我执行了7s
             */
            Thread.sleep(7000);
            return "当前函数成功的返回";
        } catch (InterruptedException e) {
            e.printStackTrace();
            return "执行异常";
        }
    }



}

第二个例子

方案:

在后端设置一个超时时间,当接口调用超过这个时间时,后端返回一个提示信息给前端。

具体实现步骤如下:

在后端代码中,使用try-catch语句块来包裹连接数据库或SVN的代码,以及调用接口的代码。

在try语句块中,设置一个超时时间(比如一分钟),使用线程来执行接口调用代码,并使用

Thread.sleep()方法让线程休眠一段时间,以模拟接口调用过程。

如果接口调用超过超时时间,在catch语句块中抛出一个异常或返回一个错误码,并将错误信息保存到日志文件中。

在catch语句块中,返回一个提示信息给前端,说明接口调用超时。

解释过程:

上述方案中,我们使用了一个try-catch语句块来控制接口调用过程。在try语句块中,我们模拟了接口调用过程,并使用Thread.sleep()方法让线程休眠一段时间。如果接口调用超过超时时间,catch语句块会捕获到这个异常并处理。在catch语句块中,我们可以抛出一个自定义的异常或返回一个错误码,并将错误信息保存到日志文件中,以便后续查看和分析。最后,我们将一个提示信息返回给前端,说明接口调用超时。通过这种方式,我们可以在后端控制接口的超时时间,避免用户等待过长时间。

import java.util.concurrent.*;  
  
public class TimeoutExample {  
    public static void main(String[] args) {  
        ExecutorService executor = Executors.newSingleThreadExecutor();  
        Future<String> future = executor.submit(() -> {  
            // 在这里执行可能会超时的操作  
            String result = executeLongRunningOperation();  
            return result;  
        });  
          
        try {  
            // 设置超时时间为7秒
            String result = future.get(7, TimeUnit.SECONDS);  
            System.out.println("Result: " + result);  
        } catch (TimeoutException e) {  
            System.out.println("Operation timed out");  
            future.cancel(true); // 取消任务  
        } catch (InterruptedException | ExecutionException e) {  
            e.printStackTrace();  
        } finally {  
            executor.shutdown(); // 关闭线程池  
        }  
    }  
      
    private static String executeLongRunningOperation() {  
        // 在这里执行你的数据库或SVN操作  
        return "Success";  
    }  
}

在上面的代码中,我们使用了一个单线程的线程池,并将可能会超时的操作提交给线程池执行。然后我们使用Future的get方法来获取操作的结果,并设置了7秒的超时时间。如果操作在规定的时间内没有完成,get方法会抛出一个TimeoutException异常。在异常处理代码中,我们取消了任务并关闭了线程池。

你可以将上述代码中的executeLongRunningOperation方法替换成你的数据库或SVN操作代码,并根据需要调整超时时间。这样,即使操作需要花费较长的时间,你的接口也不会因为超时而返回错误。

延伸

前端也是可以超时返回的

超时提醒前端的实现原理主要依赖于JavaScript的setTimeout()函数。

这个函数能在指定的时间后执行一个函数或指定的代码块。一般超时提醒的原理就是,在前端发起请求后,设置一个定时器,在定时器时间到达后还没有得到响应的话,那么就进行超时提醒。

以一个简单的fetch请求超时提醒为例,可以这样写:

let xhr = new XMLHttpRequest();  
xhr.open('GET', '/api/some-data', true);  
  
xhr.onload = function(e) {  
  if (xhr.status === 200) {  
    // 请求成功,可以进行数据处理  
    let response = JSON.parse(xhr.responseText);  
    console.log(response);  
  } else {  
    // 请求失败,进行错误处理  
    console.error('请求失败');  
  }  
};  
  
xhr.onerror = function(e) {  
  // 网络错误,如断网、服务器不可用等  
  console.error('网络错误');  
};  
  
// 设置请求超时时间(毫秒)  
xhr.timeout = 3000;

在这个例子中,如果服务器在3秒内没有响应,就会触发onerror回调,并显示网络错误信息。

需要注意的是,不同的浏览器对XMLHttpRequest的超时处理方式可能略有不同,有的浏览器可能没有提供timeout属性。因此在实际使用中,需要考虑到兼容性问题。同时,对于复杂的业务逻辑,可能需要结合Promise和async/await等ES6的特性来实现更复杂的超时处理方案。

目录
相关文章
|
3月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
436 0
|
4月前
|
人工智能 前端开发 测试技术
如何让AI帮你做前端自动化测试?我们这样落地了
本文介绍了一个基于AI的UI自动化测试框架在专有云质量保障中的工程化实践。
2023 21
如何让AI帮你做前端自动化测试?我们这样落地了
|
8月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
4月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
208 0
|
7月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
492 70
|
4月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
8月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
688 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
9月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
501 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡