feat:并发编程优化

This commit is contained in:
nieziyan 2023-12-15 18:44:27 +08:00
parent 74938b3d44
commit 40b793811b
8 changed files with 93 additions and 58 deletions

View File

@ -35,5 +35,7 @@ public interface RedisConstant {
String EMAIL_SENDER = "Email_Sender"; String EMAIL_SENDER = "Email_Sender";
String MANAGE_TOKEN = "Manage:Token"; String MANAGE_TOKEN = "Manage:Token"; // 运管系统Token
String QIYE_EMAIL_TOKEN = "QiyeEmail:Token"; // 网易企业邮箱Token
} }

View File

@ -0,0 +1,19 @@
package org.jeecg.modules.base.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class AppLoginR implements Serializable {
private String accessToken;
private String refreshToken;
private Date accessTokenExpiredTime;
private Date refreshTokenExpiredTime;
}

View File

@ -1,6 +1,8 @@
package org.jeecg.modules; package org.jeecg.modules;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -10,8 +12,7 @@ import org.jeecg.modules.base.entity.postgre.SysEmail;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.*;
import java.util.concurrent.ExecutionException;
public class Demo { public class Demo {
@ -68,13 +69,21 @@ public class Demo {
email2.setPort(143); email2.setPort(143);
List<SysEmail> list = ListUtil.toList(email1, email2); List<SysEmail> list = ListUtil.toList(email1, email2);
List<CompletableFuture<Void>> futures = new ArrayList<>();
Executor executor = Executors.newFixedThreadPool(5);
EmailServiceManager manager = EmailServiceManager.getInstance(); EmailServiceManager manager = EmailServiceManager.getInstance();
for (SysEmail email : list) { for (SysEmail email : list) {
manager.init(email); manager.init(email);
CompletableFuture.runAsync(() -> { CompletableFuture.supplyAsync(manager::canReceive, executor)
.thenAccept(status -> FileUtil.writeUtf8Lines(ListUtil.toList(status), "C:\\Users\\a\\Desktop\\"+ email.getUsername() + ".txt"));
boolean success = manager.canReceive();
});
} }
/*CompletableFuture<?> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try {
allFutures.get(); // 等待所有任务完成
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}*/
} }
} }

View File

@ -54,7 +54,7 @@ public class EmailStatusManager {
} }
private void init(){ private void init(){
sleepTime = 5 * 1000; // 睡眠时间5s sleepTime = 5 * 60 * 1000; // 睡眠时间5min
emailService = SpringContextUtils.getBean(ISysEmailService.class); emailService = SpringContextUtils.getBean(ISysEmailService.class);
} }
} }

View File

@ -50,8 +50,10 @@ public class StatusAspect {
private MonitorAlarm monitorAlarm; private MonitorAlarm monitorAlarm;
@Autowired @Autowired
private ISysServerService serverService; private ISysEmailService emailService;
@Autowired
private ISysServerService serverService;
// 新增|修改邮箱服务器信息后 异步更新其状态信息 // 新增|修改邮箱服务器信息后 异步更新其状态信息
@Async @Async
@ -61,26 +63,7 @@ public class StatusAspect {
Object[] args = point.getArgs(); Object[] args = point.getArgs();
if (ArrayUtil.length(args) > 0){ if (ArrayUtil.length(args) > 0){
SysEmail email = (SysEmail) args[0]; SysEmail email = (SysEmail) args[0];
String id = email.getId(); emailService.status2Redis(email);
String name = email.getName();
Integer isQiye = email.getIsQiye();
boolean isConn = EmailUtil.isConnection(email);
NameValue nameValue = new NameValue(name, isConn);
if (ObjectUtil.isNotNull(isQiye) && isQiye == IS.getValue()){
String username = email.getUsername();
String[] info = StrUtil.split(username, SymbolConstant.AT);
QiyeOpenPlatSDK platSDK = InstanceSDK.getInstance();
if (ArrayUtil.length(info) == 2 && ObjectUtil.isNotNull(platSDK)){
String accountName = info[0];
String domain = info[1];
RParam param = new RParam(accountName, domain);
AccountInfo accountInfo = Account.getMailAccountInfo(platSDK, param);
Integer usedQuota = accountInfo.getUsedQuota();
nameValue.setUsage(usedQuota);
}
}
String statusKey = RedisConstant.EMAIL_STATUS;
redisUtil.hset(statusKey, id, nameValue);
} }
} }

View File

@ -1,5 +1,6 @@
package org.jeecg.modules.qiyeEmail.base; package org.jeecg.modules.qiyeEmail.base;
import cn.hutool.core.bean.BeanUtil;
import com.netease.qiye.qiyeopenplatform.common.constant.ResultEnum; import com.netease.qiye.qiyeopenplatform.common.constant.ResultEnum;
import com.netease.qiye.qiyeopenplatform.common.dto.login.AppLoginResp; import com.netease.qiye.qiyeopenplatform.common.dto.login.AppLoginResp;
import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDK; import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDK;
@ -7,13 +8,22 @@ import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDKConfig;
import com.netease.qiye.qiyeopenplatform.sdk.dto.Q; import com.netease.qiye.qiyeopenplatform.sdk.dto.Q;
import com.netease.qiye.qiyeopenplatform.sdk.dto.R; import com.netease.qiye.qiyeopenplatform.sdk.dto.R;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.base.dto.AppLoginR;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
@Slf4j @Slf4j
public class InstanceSDK { public class InstanceSDK {
private static RedisUtil redisUtil;
static {
redisUtil = SpringContextUtils.getBean(RedisUtil.class);
}
public static QiyeOpenPlatSDK getInstance() { public static QiyeOpenPlatSDK getInstance() {
QiyeOpenPlatSDK qiyeOpenPlatSDK = null; QiyeOpenPlatSDK qiyeOpenPlatSDK;
try { try {
// 获取nacos armd.yaml配置文件中企业邮箱的相关配置信息 // 获取nacos armd.yaml配置文件中企业邮箱的相关配置信息
Property property = Property.getInstance(); Property property = Property.getInstance();
@ -33,8 +43,19 @@ public class InstanceSDK {
// 使用配置类创建SDK实例 // 使用配置类创建SDK实例
qiyeOpenPlatSDK = new QiyeOpenPlatSDK("qiyeOpenPlatSDK", qiyeOpenPlatSDKConfig); qiyeOpenPlatSDK = new QiyeOpenPlatSDK("qiyeOpenPlatSDK", qiyeOpenPlatSDKConfig);
// 通过授权码登录 获取Token类并给SDK实例设置Token类 // 通过授权码登录 获取Token类并给SDK实例设置Token类
if (redisUtil.hasKey(RedisConstant.QIYE_EMAIL_TOKEN)){
AppLoginR appLoginR = (AppLoginR) redisUtil.get(RedisConstant.QIYE_EMAIL_TOKEN);
AppLoginResp appLoginResp = new AppLoginResp();
BeanUtil.copyProperties(appLoginR, appLoginResp);
qiyeOpenPlatSDK.getQiyeOpenPlatSDKConfig().setupToken(appLoginResp);
return qiyeOpenPlatSDK;
}
R<AppLoginResp> appLoginRespR = qiyeOpenPlatSDK.appLogin(authCode); R<AppLoginResp> appLoginRespR = qiyeOpenPlatSDK.appLogin(authCode);
AppLoginResp appLoginResp = appLoginRespR.getDataBean(AppLoginResp.class); AppLoginResp appLoginResp = appLoginRespR.getDataBean(AppLoginResp.class);
AppLoginR appLoginR = new AppLoginR();
BeanUtil.copyProperties(appLoginResp, appLoginR);
// 设置有效期 12h
redisUtil.set(RedisConstant.QIYE_EMAIL_TOKEN, appLoginR, 12 * 60 * 60);
qiyeOpenPlatSDK.getQiyeOpenPlatSDKConfig().setupToken(appLoginResp); qiyeOpenPlatSDK.getQiyeOpenPlatSDKConfig().setupToken(appLoginResp);
return qiyeOpenPlatSDK; return qiyeOpenPlatSDK;
}catch (Exception e){ }catch (Exception e){

View File

@ -1,6 +1,7 @@
package org.jeecg.modules.service; package org.jeecg.modules.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDK;
import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.QueryRequest;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.base.dto.SourceDto; import org.jeecg.modules.base.dto.SourceDto;
@ -29,5 +30,7 @@ public interface ISysEmailService extends IService<SysEmail> {
void status2Redis(); void status2Redis();
void status2Redis(SysEmail email);
String getNameById(String id); String getNameById(String id);
} }

View File

@ -37,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.jeecg.modules.base.enums.Enabled.ENABLED; import static org.jeecg.modules.base.enums.Enabled.ENABLED;
@ -220,37 +221,34 @@ public class SysEmailServiceImpl extends ServiceImpl<SysEmailMapper, SysEmail> i
public void status2Redis() { public void status2Redis() {
// 获取所有配置的邮箱服务器 // 获取所有配置的邮箱服务器
List<SysEmail> emails = list(); List<SysEmail> emails = list();
// 查询是否有企业邮箱 // 使用并发 更新邮箱状态及用量
List<Integer> hasQieye = emails.stream().map(SysEmail::getIsQiye)
.filter(ObjectUtil::isNotNull).filter(isQiye -> Qiye.IS.getValue() == isQiye)
.collect(Collectors.toList());
QiyeOpenPlatSDK platSDK = null;
// 如果emails中存在企业邮箱 则提前登录为查询邮箱信息做准备
if (CollUtil.isNotEmpty(hasQieye)) platSDK = InstanceSDK.getInstance();
Map<String, Object> statusMap = new HashMap<>();
for (SysEmail email : emails) { for (SysEmail email : emails) {
String id = email.getId(); CompletableFuture.runAsync(() -> status2Redis(email));
String name = email.getName(); }
Integer isQiye = email.getIsQiye(); }
boolean isConn = EmailUtil.isConnection(email);
NameValue nameValue = new NameValue(name, isConn); @Override
if (ObjectUtil.isNotNull(isQiye) && isQiye == IS.getValue()){ public void status2Redis(SysEmail email) {
String username = email.getUsername(); String id = email.getId();
String[] info = StrUtil.split(username, SymbolConstant.AT); String name = email.getName();
if (ArrayUtil.length(info) == 2 && ObjectUtil.isNotNull(platSDK)){ Integer isQiye = email.getIsQiye();
String accountName = info[0]; boolean isConn = EmailUtil.isConnection(email);
String domain = info[1]; NameValue nameValue = new NameValue(name, isConn);
RParam param = new RParam(accountName, domain); if (ObjectUtil.isNotNull(isQiye) && isQiye == IS.getValue()){
AccountInfo accountInfo = Account.getMailAccountInfo(platSDK, param); String username = email.getUsername();
Integer usedQuota = accountInfo.getUsedQuota(); String[] info = StrUtil.split(username, SymbolConstant.AT);
nameValue.setUsage(usedQuota); QiyeOpenPlatSDK platSDK = InstanceSDK.getInstance();
} if (ArrayUtil.length(info) == 2 && ObjectUtil.isNotNull(platSDK)){
} String accountName = info[0];
statusMap.put(id, nameValue); String domain = info[1];
RParam param = new RParam(accountName, domain);
AccountInfo accountInfo = Account.getMailAccountInfo(platSDK, param);
Integer usedQuota = accountInfo.getUsedQuota();
nameValue.setUsage(usedQuota);
}
} }
// 将邮箱服务器连接状态更新到reids
String statusKey = RedisConstant.EMAIL_STATUS; String statusKey = RedisConstant.EMAIL_STATUS;
redisUtil.hmset(statusKey, statusMap); redisUtil.hset(statusKey, id, nameValue);
} }
@Override @Override