首页 > 数据库 >Spring Book Club + java查询数据库 + 百万数据 + 同步Elasticsearch(ES)+ 多线程 + FeignClient(远程调用)

Spring Book Club + java查询数据库 + 百万数据 + 同步Elasticsearch(ES)+ 多线程 + FeignClient(远程调用)

时间:2024-07-20 12:55:27浏览次数:11  
标签:FeignClient java ArrayList list add 线程 new 多线程 public

@FeignClient(name = "bwie-elastic")
public interface EsFeign {


    @PostMapping("/add")
    public Result add(@RequestBody ArrayList<ResourceInfo> resourceInfo);
}
@RestController
public class UserController implements ApplicationRunner {
    @Autowired
    private UserMapper userService;

    @Autowired
    private EsFeign feign;

    private static final int THREAD_COUNT_SIZE = 5000;

    public void list() {
        //计算表总数
        Integer integer = userService.UserSum();
        //记录开始时间
        long start = System.currentTimeMillis();
        //new个和表总数一样长的ArrayList
        List<ResourceInfo> threadList = new ArrayList<>(integer);
        // 线程数,以5000条数据为一个线程,总数据大小除以5000,再加1
        int round = integer / THREAD_COUNT_SIZE + 1;
        //new一个临时储存List的Map,以线程名为k,用做list排序
        Map<Integer, List<ResourceInfo>> temporaryMap = new HashMap<>(round);
        // 程序计数器
        final CountDownLatch count = new CountDownLatch(round);
        // 创建线程
        ExecutorService executor = Executors.newFixedThreadPool(round);

        // 分配数据
        try {
            for (int i = 0; i < round; i++) {
                //该线程的查询开始值
                int startLen = i * THREAD_COUNT_SIZE;
                int k = i + 1;
                executor.execute(() -> {
                    ArrayList<ResourceInfo> resourceInfos = userService.list(startLen);
                    feign.add(resourceInfos);
                    temporaryMap.put(k, resourceInfos);
                    System.out.println("正在处理线程【" + k + "】的数据,数据大小为:" + resourceInfos.size());
                    count.countDown();
                });
            }

            count.await(); // 等待所有线程执行完毕

            long end = System.currentTimeMillis();
            System.out.println("数据查询耗时:" + (end - start) + "ms");

            temporaryMap.values().forEach(threadList::addAll);
            System.out.println("list长度为:" + threadList.size());

        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        } finally {
            temporaryMap.clear();
            executor.shutdown(); // 关闭线程池
        }
    }


@Mapper
public interface UserMapper {

    Integer UserSum();


    ArrayList<ResourceInfo> list(@Param("startLen") int startLen);

}


    @Override
    public void run(ApplicationArguments args) {
        this.list();
    }
}
@RestController
public class EsController {
    @Autowired
    private EsService esService;

    @PostMapping("/add")
    public Result add(@RequestBody ArrayList<ResourceInfo> resourceInfo){
        esService.addAsync(resourceInfo);
        Result<Object>result= Result.success();
        return result;
    }

}
@Service
public class EsServiceImpl implements EsService {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Override
    public CompletableFuture<Void> addAsync(ArrayList<ResourceInfo> resourceInfoList) {
        return CompletableFuture.runAsync(() -> {
            try {
                BulkRequest bulkRequest = new BulkRequest();

                for (ResourceInfo resourceInfo : resourceInfoList) {
                    IndexRequest indexRequest = new IndexRequest("apply")
                            .id(String.valueOf(resourceInfo.getId()))
                            .source(JSONObject.toJSONString(resourceInfo), XContentType.JSON);
                    bulkRequest.add(indexRequest);
                }

                BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);

                if (bulkResponse.hasFailures()) {
                    for (BulkItemResponse bulkItemResponse : bulkResponse) {
                        if (bulkItemResponse.isFailed()) {
                            BulkItemResponse.Failure failure = bulkItemResponse.getFailure();
                            System.out.println("Failed to index document with id: " + bulkItemResponse.getId() + ", failure message: " + failure.getMessage());
                        }
                    }
                }

            } catch (IOException e) {
                e.printStackTrace(); // 也可以选择记录日志或抛出自定义异常
            }
        });
    }
}

标签:FeignClient,java,ArrayList,list,add,线程,new,多线程,public
From: https://blog.csdn.net/c8899y/article/details/140569374

相关文章

  • 图书管理系统(Java--数据库课设)
    1、课程设计要求:实现用户的登陆与注册用户要区分是管理员还是普通用户管理员能够对图书的数量、名称等进行增删改查在书未归还时不可删除用户能够对图书进行查看和借书以及还书,并记录具体时间书数量不足时不能够对书籍进行借用2、代码逻辑以及基础解释        ......
  • Java 中的异常
    异常:就是出现的问题。在Java中异常被当成对象进行处理,所有的异常类都继承于Throwable类,如果Java提供的异常类并不能满足需求,用户还可以自己定义一个异常类。下面是异常体系结构:Throwable又分成了Error和Exception。本文仅讨论Exception及其子类,因为Error出现的话也不是我们......
  • java Selenium,定位 伪元素.UI自动化
    Java中,要获取这个表单字段前面的星号“*”,因为是用的伪元素,无法直接通过常规定位获取字符,需要用到JavascriptExecutor。importorg.openqa.selenium.By;importorg.openqa.selenium.JavascriptExecutor;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.We......
  • 超详细的MySQL基本使用教程(1) 黑马程序员javaweb学习笔记+练习(附带idea新版ui图形化页
    什么是数据库MySQL概述数据模型关系型数据库SQL简介小结DDL-数据库的设计数据库的常见操作选中该语句然后点运行就成功运行了可以直接用图形化界面进行操作跳转到控制台表的常见操作1.创建练习在db01中创建这张表其中comment是鼠标悬停在......
  • 135java jsp SSM连锁店经营会员管理系统(源码+文档+任务书+运行视频+讲解视频)
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • 127java jsp SSM乡镇篮球队管理系统球队球员赛程管理(源码+文档+运行视频+讲解视频)
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • Java程序员转到仓颉开发可行吗
    Java程序员转到仓颉开发是可行的,但需要考虑多个因素,包括仓颉编程语言的特性、Java与仓颉之间的异同点、以及个人的技能储备和职业规划。仓颉编程语言的特性仓颉编程语言是华为公司自主研发的一款面向全场景智能的下一代应用编程语言。自主可控,仓颉编程语言没有基于任何现有......
  • JavaScript与DOM的奇妙探险:从入门到精通的实战笔记
    文章目录JavaScript基本说明特点两种使用方式在script中写使用script标签引入JS文件数据类型介绍特殊值运算符算数运算符赋值运算符逻辑运算符:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bbf5c150699845af837d3c45c926e941.png)条件运算符数组的定义基......
  • [0178]基于JAVA的产品配送智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的产品配送智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景:随着电子商务和新零售行业的快速发展,产品配送已成为商业运营中不可或缺的重要环节。传统的配送管理模式往往存在信息更......
  • Java NIO 快速入门:Java 非阻塞 IO 编程详解
    一、NIO简介1.概述介绍:JavaNIO(NewInput/Output)是从Java1.4开始引入的一组新的IO库,旨在替代传统的阻塞式IO。NIO提供了更高效的IO操作,支持非阻塞模式和多路复用,适用于高并发场景。概述:NIO中通过Buffer作为缓存区,Channel作为数据通道来传输数据进行数据通讯,通过S......