From 321849b4cba13a9542f5c219392d922d79333407 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 28 Feb 2024 20:47:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=9A=E7=BA=BF=E7=A8=8B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/CustomNameThreadFactory.java | 47 +++++++++++++ .../domain/config/ThreadPoolConfig.java | 27 +++++++ .../SubjectCategoryDomainServiceImpl.java | 70 +++++++++++++------ 3 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/CustomNameThreadFactory.java create mode 100644 qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/ThreadPoolConfig.java diff --git a/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/CustomNameThreadFactory.java b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/CustomNameThreadFactory.java new file mode 100644 index 0000000..24883d7 --- /dev/null +++ b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/CustomNameThreadFactory.java @@ -0,0 +1,47 @@ +package com.landaiqing.subject.domain.config; + +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 自定义名称的线程工厂 + * + * @author: landaiqing + * @date: 2024/2/18 + */ +public class CustomNameThreadFactory implements ThreadFactory { + + private static final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + CustomNameThreadFactory(String name) { + SecurityManager s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : + Thread.currentThread().getThreadGroup(); + if (StringUtils.isBlank(name)) { + name = "pool"; + } + namePrefix = name + "-" + + poolNumber.getAndIncrement() + + "-thread-"; + } + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(group, r, + namePrefix + threadNumber.getAndIncrement(), + 0); + if (t.isDaemon()){ + t.setDaemon(false); + } + if (t.getPriority() != Thread.NORM_PRIORITY){ + t.setPriority(Thread.NORM_PRIORITY); + } + return t; + } + +} diff --git a/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/ThreadPoolConfig.java b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/ThreadPoolConfig.java new file mode 100644 index 0000000..33410e0 --- /dev/null +++ b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/config/ThreadPoolConfig.java @@ -0,0 +1,27 @@ +package com.landaiqing.subject.domain.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 线程池的config管理 + * + * @author: landaiqing + * @date: 2024/2/18 + */ +@Configuration +public class ThreadPoolConfig { + + @Bean(name = "labelThreadPool") + public ThreadPoolExecutor getLabelThreadPool() { + return new ThreadPoolExecutor(20, 100, 5, + TimeUnit.SECONDS, new LinkedBlockingDeque<>(40), + new CustomNameThreadFactory("label"), + new ThreadPoolExecutor.CallerRunsPolicy()); + } + +} diff --git a/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/service/impl/SubjectCategoryDomainServiceImpl.java b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/service/impl/SubjectCategoryDomainServiceImpl.java index 0edfd71..e5ef13b 100644 --- a/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/service/impl/SubjectCategoryDomainServiceImpl.java +++ b/qing-yu-club-subject/qing-yu-club-domain/src/main/java/com/landaiqing/subject/domain/service/impl/SubjectCategoryDomainServiceImpl.java @@ -3,6 +3,7 @@ package com.landaiqing.subject.domain.service.impl; import com.alibaba.fastjson.JSON; import com.landaiqing.subject.common.enums.CategoryTypeEnum; import com.landaiqing.subject.common.enums.IsDeletedFlagEnum; +import com.landaiqing.subject.domain.config.ThreadPoolConfig; import com.landaiqing.subject.domain.convert.SubjectCategoryConverter; import com.landaiqing.subject.domain.entity.SubjectCategoryBO; import com.landaiqing.subject.domain.entity.SubjectLabelBO; @@ -13,13 +14,18 @@ import com.landaiqing.subject.infra.basic.entity.SubjectMapping; import com.landaiqing.subject.infra.basic.service.SubjectCategoryService; import com.landaiqing.subject.infra.basic.service.SubjectLabelService; import com.landaiqing.subject.infra.basic.service.SubjectMappingService; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.concurrent.FutureTask; +import java.util.concurrent.ThreadPoolExecutor; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,6 +40,9 @@ public class SubjectCategoryDomainServiceImpl implements SubjectCategoryDomainSe @Resource private SubjectLabelService subjectLabelService; + @Resource + private ThreadPoolExecutor labelThreadPool; + /** * @description: 新增分类 * @param: [subjectCategoryBO] @@ -113,6 +122,7 @@ public class SubjectCategoryDomainServiceImpl implements SubjectCategoryDomainSe * @author landaiqing * @date: 2024/2/26 20:46 */ + @SneakyThrows @Override public List queryCategoryAndLabel(SubjectCategoryBO subjectCategoryBO) { // 查询当前分类下的所以的分类 @@ -126,28 +136,48 @@ public class SubjectCategoryDomainServiceImpl implements SubjectCategoryDomainSe } List categoryBOList = SubjectCategoryConverter.INSTANCE.convertBoToCategory(subjectCategoryList); // 一次获取标签信息 + List>>> futureTaskList = new LinkedList<>(); + Map> map = new HashMap<>(); + //线程池并发调用 categoryBOList.forEach(category -> { - SubjectMapping subjectMapping = new SubjectMapping(); - subjectMapping.setCategoryId(category.getId()); - List mappingList = subjectMappingService.queryLabelId(subjectMapping); - if (CollectionUtils.isEmpty(mappingList)) { - return; - } - List labelIdList = mappingList.stream().map(SubjectMapping::getLabelId).collect(Collectors.toList()); - List subjectLabelList = subjectLabelService.batchQueryById(labelIdList); - List labelBOList = new LinkedList<>(); - subjectLabelList.forEach(label -> { - SubjectLabelBO subjectLabelBO = new SubjectLabelBO(); - subjectLabelBO.setId(label.getId()); - subjectLabelBO.setLabelName(label.getLabelName()); - subjectLabelBO.setCategoryId(label.getCategoryId()); - subjectLabelBO.setSortNum(label.getSortNum()); - labelBOList.add(subjectLabelBO); - }); - category.setLabelBOList(labelBOList); - + FutureTask>> futureTask = new FutureTask<>(() -> + getLabelBOList(category)); + futureTaskList.add(futureTask); + labelThreadPool.submit(futureTask); + }); + for (FutureTask>> futureTask : futureTaskList) { + Map> resultMap = futureTask.get(); + if (CollectionUtils.isEmpty(resultMap)) { + continue; + } + map.putAll(resultMap); + } + categoryBOList.forEach(categoryBO -> { + categoryBO.setLabelBOList(map.get(categoryBO.getId())); }); - return categoryBOList; } + + private Map> getLabelBOList(SubjectCategoryBO category) { + Map> labelMap = new HashMap<>(); + SubjectMapping subjectMapping = new SubjectMapping(); + subjectMapping.setCategoryId(category.getId()); + List mappingList = subjectMappingService.queryLabelId(subjectMapping); + if (CollectionUtils.isEmpty(mappingList)) { + return null; + } + List labelIdList = mappingList.stream().map(SubjectMapping::getLabelId).collect(Collectors.toList()); + List subjectLabelList = subjectLabelService.batchQueryById(labelIdList); + List labelBOList = new LinkedList<>(); + subjectLabelList.forEach(label -> { + SubjectLabelBO subjectLabelBO = new SubjectLabelBO(); + subjectLabelBO.setId(label.getId()); + subjectLabelBO.setLabelName(label.getLabelName()); + subjectLabelBO.setCategoryId(label.getCategoryId()); + subjectLabelBO.setSortNum(label.getSortNum()); + labelBOList.add(subjectLabelBO); + }); + labelMap.put(category.getId(), labelBOList); + return labelMap; + } }