返回顶部
首页 > 资讯 > 后端开发 > Python >Java接口异步调用优化技巧详解
  • 469
分享到

Java接口异步调用优化技巧详解

Java接口异步调用Java接口调用Java异步调用 2023-05-19 08:05:33 469人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1,自己new线程或者线程池2,Sping mvc3,修改单个任务为批量任务在日常项目中,我们经常采用多线程异步调用的方式来提高接口的响应时间。 在实际情况下,我们如何通过异步方

在日常项目中,我们经常采用多线程异步调用的方式来提高接口的响应时间。

在实际情况下,我们如何通过异步方式优化我们的接口呢,有以下几种常见思路

1,自己new线程或者线程池

如下我们把三个耗时操作交给新的线程或者线程池执行。

当请求过来的时候Tomcat线程会等待子线程全部执行完成,然后汇总结果进行返回。

 
    @GetMapping("getAllEGone")
    public Map<String, Object> getAllEgOne() throws ExecutionException, InterruptedException {
        FutureTask<String> stringFutureTaskOne = new FutureTask<>(asyncService::getOne);
        FutureTask<String> stringFutureTaskTwo = new FutureTask<>(asyncService::getTwo);
        FutureTask<String> stringFutureTaskThree = new FutureTask<>(asyncService::getThree);
        new Thread(stringFutureTaskOne).start();
        new Thread(stringFutureTaskTwo).start();
        new Thread(stringFutureTaskThree).start();
        Map<String, Object> result = new HashMap<>();
        result.put("one", stringFutureTaskOne.get());
        result.put("two", stringFutureTaskTwo.get());
        result.put("three", stringFutureTaskThree.get());
        return result;
    }

2,Sping Mvc

我们返回一个Callable 这时候会开启一个新的线程不会阻塞tomcat的线程

 
    @GetMapping("getAllEgTwo")
    public Callable<Map<String, Object>> getAllEgTwo() {
        return () -> {
            FutureTask<String> stringFutureTaskOne = new FutureTask<>(asyncService::getOne);
            FutureTask<String> stringFutureTaskTwo = new FutureTask<>(asyncService::getTwo);
            FutureTask<String> stringFutureTaskThree = new FutureTask<>(asyncService::getThree);
            new Thread(stringFutureTaskOne).start();
            new Thread(stringFutureTaskTwo).start();
            new Thread(stringFutureTaskThree).start();
            Map<String, Object> result = new HashMap<>(3);
            result.put("one", stringFutureTaskOne.get());
            result.put("two", stringFutureTaskTwo.get());
            result.put("three", stringFutureTaskThree.get());
            return result;
        };
    }

3,修改单个任务为批量任务

在项目中我们有很多数据库的查询,批量查询要快于单个查询,中间省了很多io操作。

思考能不能吧单个调用转换成批量呢,针对并发比较高的接口。合并多个用户的调用,转换成一批进行查询。

把一个时间段内的请求放进队列,然后通过定时任务进行批量查询,然后进行响应分发。

import com.example.demo.conf.SnowFlake;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.WEB.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;

@RestController
@RequestMapping("async")
@Slf4j
public class AsyncController {
    @Autowired
    private AsyncService asyncService;
    private final SnowFlake worker = new SnowFlake(1, 1, 1);
    private final LinkedBlockingQueue<RequestBody<Long, UserInfo>> queue = new LinkedBlockingQueue<>();
    @PostConstruct
    public void doWork() {
        ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
        service.scheduleAtFixedRate(() -> {
            //每次运行的时候 去拿MQ中的数据量
            int size = queue.size();
            if (size == 0) {
                return;
            }
            log.info("批量获取任务:{}-{}", Thread.currentThread().getName(), size);
            //多次请求收集到一起一块去批量请求下面的需要的数据
            List<Long> requestBodyList = new ArrayList<>();
            List<RequestBody<Long, UserInfo>> requestBodies = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                RequestBody<Long, UserInfo> requestBody = queue.poll();
                requestBodies.add(requestBody);
                Long requestParam = requestBody.getRequestParam();
                requestBodyList.add(requestParam);
            }
            List<UserInfo> fourBatch;
            try {
                fourBatch = asyncService.getFourBatch(requestBodyList);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (CollectionUtils.isEmpty(fourBatch)) {
                return;
            }
            for (UserInfo x : fourBatch) {
                for (RequestBody<Long, UserInfo> y : requestBodies) {
                    if (x.getId().equals(y.getRequestParam())) {
                        y.getResult().complete(x);
                        break;
                    }
                }
            }
        }, 1000L, 50L, TimeUnit.MILLISECONDS);
    }
    
    @GetMapping("getAllEgFour")
    public UserInfo getAllEgFour(Long userId) throws ExecutionException, InterruptedException {
        if (userId == null) {
            userId = worker.nextId();
        }
        log.info("开始获取数据: {}: {}", Thread.currentThread().getName(), userId);
        RequestBody<Long, UserInfo> objectObjectRequestBody = new RequestBody<>();
        CompletableFuture<UserInfo> completableFuture = new CompletableFuture<>();
        objectObjectRequestBody.setRequestParam(userId);
        objectObjectRequestBody.setResult(completableFuture);
        queue.add(objectObjectRequestBody);
        UserInfo userInfo = completableFuture.get();
        log.info("完成获取数据: {}: {}", Thread.currentThread().getName(), userInfo);
        return userInfo;
    }
}

到此这篇关于Java接口异步调用优化技巧详解的文章就介绍到这了,更多相关Java接口异步调用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java接口异步调用优化技巧详解

本文链接: https://lsjlt.com/news/212702.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java接口异步调用优化技巧详解
    目录1,自己new线程或者线程池2,Sping Mvc3,修改单个任务为批量任务在日常项目中,我们经常采用多线程异步调用的方式来提高接口的响应时间。 在实际情况下,我们如何通过异步方...
    99+
    2023-05-19
    Java接口异步调用 Java接口调用 Java异步调用
  • java接口性能优化技巧
    目录背景哪些问题会引起接口性能问题问题解决慢查询(基于 mysql)①深度分页②未加索引③索引失效④join 过多 or 子查询过多⑤in 的元素过多⑥单纯的数据量过大业务逻辑复杂①...
    99+
    2024-04-02
  • 异步协程开发技巧:实现高效的API接口调用
    异步协程开发技巧:实现高效的API接口调用随着Web应用的发展和用户需求的增加,我们经常需要调用各种API接口来实现我们的功能。传统的API调用方式往往是同步的,即在调用API接口时,当前线程会被阻塞,等待API返回结果后再继续执行下一步操...
    99+
    2023-12-17
    协程 异步编程 高效调用
  • Java多线程异步调用性能调优方法详解
    目录概述同步调用和异步调用Future类图Future的不足代码代码地址TestPaymentServiceCheckServiceOrderService总结概述 大型电商公司的支...
    99+
    2024-04-02
  • 分布式系统中Java异步编程的优化技巧?
    分布式系统中Java异步编程的优化技巧 随着互联网技术的发展,分布式系统的使用越来越广泛,而Java作为一种流行的编程语言,在分布式系统中也扮演着重要的角色。Java异步编程技术可以帮助开发人员优化分布式系统的性能和响应速度,因此我们需要了...
    99+
    2023-10-15
    分布式 linux 异步编程
  • golang接口优化的技巧有哪些
    优化golang接口的技巧有以下几点: 减少接口方法的数量:接口方法的数量越少,接口的实现者需要实现的方法就越少,从而减少了代码...
    99+
    2024-02-29
    golang
  • java接口异步调用的方法是什么
    在Java中,可以使用以下几种方法来实现接口的异步调用: 使用回调函数(Callback):在接口中定义一个回调方法,然后在调用方...
    99+
    2023-10-25
    java
  • Java 接口框架打包:最佳实践与优化技巧!
    在 Java 开发中,接口框架起到了非常重要的作用。接口框架不仅可以提高代码的复用性,也可以使代码结构更加清晰。然而,当我们需要将一个复杂的接口框架打包成一个可供他人使用的 jar 包时,就需要考虑一些最佳实践和优化技巧。本文将为大家介绍...
    99+
    2023-08-31
    打包 接口 框架
  • java异步调用第三方接口怎么实现
    在Java中,可以使用多线程或使用异步框架来实现异步调用第三方接口。1. 使用多线程:可以创建一个新的线程来执行第三方接口的调用操作...
    99+
    2023-10-09
    java
  • golang函数调用的优化技巧
    go 函数调用优化技巧答案:通过优化函数调用技术,可显著提高 go 程序性能。减少函数调用次数: 减少不必要的调用次数,使用位运算替代函数调用。内联函数: 将函数体嵌入调用函数,避免函数...
    99+
    2024-04-29
    函数调用优化 golang 作用域
  • Java使用Hutool调用WebService接口详解
    提示:本文显示baidu.com,皆为脱敏用,并非真正地址。 目录 前言 一、WebService是什么? 二、使用步骤 1.验证链接。 2.Soap调用测试 3.获取需要用到的数据 4.Hutool工具类调用 三、示例 1.单个入...
    99+
    2023-09-01
    1024程序员节
  • 基于Java接口回调详解
    目录Java接口回调产生接口回调的场景什么是接口回调在代码中的使用Java接口回调测试接口类实现类回调实现测试Java接口回调 产生接口回调的场景 在现实生活中,产生接口回调的场景很...
    99+
    2024-04-02
  • Java中使用同步回调和异步回调的示例详解
    目录(一)同步回调(1)匿名内部类回调(2)Lambda 回调(二)异步回调(1)简单的线程回调(2)异步并行回调(3)CompletableFuture 回调小结完整代码(一)同步...
    99+
    2023-05-16
    java同步回调 java异步回调 java异步和同步回调
  • MySQL中的索引优化技巧详解
    MySQL是一个开源的关系型数据库管理系统,被广泛应用于各种网站和应用程序中。索引是MySQL中关键的性能优化手段之一,对于大型数据表来说尤为重要。本文将介绍MySQL中的索引优化技巧,并附加相应的代码示例。一、什么是索引索引是一种特殊的数...
    99+
    2023-10-22
    技巧 优化 索引
  • Windows Server 2008 四项优化技巧详解
    相比旧版本操作系统,Windows Server 2008系统绝对是一款与众不同的系统,该系统新推出了许多让人眼睛为之一亮的功能,并且它在运行安全性方面也有了大幅度地提高。不过,这并不意味着每个人都能...
    99+
    2023-05-24
    win2008 优化 技巧
  • WinXP优化技巧之关闭冗余无用的接口设备
      WinXP系统由于自身的诸多优点,即使被微软停止服务了,依然有很多的用户使用它,很多低配置的电脑更是将WinXP当作首选安装系统,但很多用户仍不满足,想要将其配置成最优性能,其中关闭冗余接口设备就成为了重点目标。  ...
    99+
    2023-06-12
    WinXP 接口设备 关闭 技巧 冗余 优化 接口
  • Java接口回调的本质详解
    本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用 virtual dispatch 机制会首先从 receiver(...
    99+
    2024-04-02
  • Java多线程异步调用性能如何调优
    这篇文章主要介绍“Java多线程异步调用性能如何调优”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java多线程异步调用性能如何调优”文章能帮助大家解决问题。概述大型电商公司的支付聚合服务都有这类的...
    99+
    2023-06-29
  • MySQL数据库十大优化技巧详解
    本篇内容主要讲解“MySQL数据库十大优化技巧详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库十大优化技巧详解”吧!  1、优化你的MySQL...
    99+
    2024-04-02
  • java接口性能从20s优化到500ms示例详解
    目录前言1. 案发现场2. 现状3. 第一次优化4. 第二次优化5. 第三次优化5.1 前端做分页5.2 分批调用接口前言 接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作