24282 пре 2 година
родитељ
комит
9d88e01b67

+ 40 - 9
src/main/java/com/fjhx/config/TaskPoolConfig.java

@@ -1,5 +1,6 @@
 package com.fjhx.config;
 
+import com.fjhx.config.exception.ServiceException;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -15,24 +16,54 @@ import java.util.concurrent.ThreadPoolExecutor;
 @Configuration
 public class TaskPoolConfig {
 
-    public static final String taskExecutor = "taskExecutor";
+    /**
+     * 同步邮件
+     */
+    public static final String SYNC_MAILBOX_EXECUTOR = "syncMailboxExecutor";
 
-    @Bean(name = taskExecutor)
-    public Executor taskExecutor() {
+    /**
+     *
+     */
+    public static final String EXECUTOR = "executor";
+
+    @Bean(name = SYNC_MAILBOX_EXECUTOR)
+    public Executor syncMailboxExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-        //配置核心线程数
+        // 配置核心线程数
         executor.setCorePoolSize(5);
-        //配置最大线程数
+        // 配置最大线程数
         executor.setMaxPoolSize(10);
-        //配置队列大小
+        // 配置队列大小
         executor.setQueueCapacity(10);
         // 缓冲队列大小
         executor.setKeepAliveSeconds(10);
-        //配置线程池中的线程的名称前缀
-        executor.setThreadNamePrefix("async-service:");
+        // 配置线程池中的线程的名称前缀
+        executor.setThreadNamePrefix("async-syncMailboxExecutor:");
+        // 线程池对拒绝任务的处理策略:抛出异常
+        executor.setRejectedExecutionHandler((r, tempExecutor) -> {
+            throw new ServiceException("系统繁忙,请稍后再试");
+        });
+        // 执行初始化
+        executor.initialize();
+        return executor;
+    }
+
+    @Bean(name = EXECUTOR)
+    public Executor executor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        // 配置核心线程数
+        executor.setCorePoolSize(10);
+        // 配置最大线程数
+        executor.setMaxPoolSize(100);
+        // 配置队列大小
+        executor.setQueueCapacity(100);
+        // 缓冲队列大小
+        executor.setKeepAliveSeconds(100);
+        // 配置线程池中的线程的名称前缀
+        executor.setThreadNamePrefix("async-executor:");
         // 线程池对拒绝任务的处理策略:由调用线程(提交任务的线程)处理该任务
         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
-        //执行初始化
+        // 执行初始化
         executor.initialize();
         return executor;
     }

+ 59 - 100
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -12,11 +12,10 @@ import com.fjhx.config.TaskPoolConfig;
 import com.fjhx.config.exception.EmailEngineException;
 import com.fjhx.config.redis.RedisCache;
 import com.fjhx.constants.RedisConstant;
-import com.fjhx.constants.SendConstant;
 import com.fjhx.entity.EmailInfo;
 import com.fjhx.entity.EmailMessage;
 import com.fjhx.entity.EmailMessageAttachment;
-import com.fjhx.entity.EmailMessageSend;
+import com.fjhx.entity.EmailMessageContent;
 import com.fjhx.enums.SendEventEnum;
 import com.fjhx.service.*;
 import com.fjhx.utils.EmailEngineUtil;
@@ -31,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -48,9 +48,17 @@ public class AccountServiceImpl implements IAccountService {
     @Autowired
     private IEmailMessageAttachmentService emailMessageAttachmentService;
 
-    @Qualifier(TaskPoolConfig.taskExecutor)
     @Autowired
-    private Executor executor;
+    private IEmailMessageContentService emailMessageContentService;
+
+
+    @Qualifier(TaskPoolConfig.SYNC_MAILBOX_EXECUTOR)
+    @Autowired
+    private Executor syncMailboxExecutor;
+
+    @Qualifier(TaskPoolConfig.EXECUTOR)
+    @Autowired
+    private Executor syncExecutor;
 
     /**
      * 每页获取多少封邮件
@@ -60,12 +68,9 @@ public class AccountServiceImpl implements IAccountService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public EmailInfo binding(BindingVo bindingVo) {
-
+        String email = bindingVo.getEmail();
         EmailInfo emailInfo;
-
         try {
-            String email = bindingVo.getEmail();
-
             emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, email));
             // 如果存在,直接返回邮箱信息
             if (emailInfo != null) {
@@ -77,7 +82,6 @@ public class AccountServiceImpl implements IAccountService {
             EmailEngineUtil.createAccount(bindingVo);
             // redis添加同步进度
             this.progressInitialization(bindingVo);
-
         } catch (Exception e) {
             EmailEngineUtil.deleteAccount(bindingVo.getEmail());
             throw e;
@@ -149,11 +153,10 @@ public class AccountServiceImpl implements IAccountService {
         String mailbox = bindingVo.getPath();
         int pages = bindingVo.getPages();
 
-        executor.execute(() -> {
+        syncMailboxExecutor.execute(() -> {
             int page = pageFlag;
             try {
                 while (page < pages) {
-                    ThreadUtil.sleep(3000);
                     // 分页获取文件夹邮件
                     MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, page, SIZE);
                     // 邮件信息
@@ -171,7 +174,6 @@ public class AccountServiceImpl implements IAccountService {
             } catch (Exception e) {
                 log.error("未知原因同步邮件失败:{}", email, e);
             }
-
         });
 
         String redisKey = RedisConstant.PROGRESS_KEY + email;
@@ -193,13 +195,11 @@ public class AccountServiceImpl implements IAccountService {
             emailMessageList.add(message);
 
             List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
-
             if (attachments != null && attachments.size() > 0) {
                 for (MessageVo.MessagesDTO.AttachmentsDTO attachment : attachments) {
                     emailMessageAttachmentList.add(this.createMessageAttachment(message, attachment));
                 }
             }
-
         }
 
         // 保存邮件
@@ -254,83 +254,6 @@ public class AccountServiceImpl implements IAccountService {
     }
 
     /**
-     * 添加推送信息
-     */
-    private void addMessageSend(List<EmailMessageSend> emailMessageSendList, MessageVo.MessagesDTO messagesDTO) {
-        // 收件人
-        List<MessageVo.MessagesDTO.ToDTO> to = messagesDTO.getTo();
-        if (ObjectUtils.isNotEmpty(to)) {
-            for (MessageVo.MessagesDTO.ToDTO toDTO : to) {
-                EmailMessageSend emailMessageSend = new EmailMessageSend();
-                emailMessageSend.setMessageId(messagesDTO.getId());
-                emailMessageSend.setType(SendConstant.TO);
-                emailMessageSend.setName(toDTO.getName());
-                emailMessageSend.setAddress(toDTO.getAddress());
-                emailMessageSendList.add(emailMessageSend);
-            }
-        }
-
-        // 抄送人
-        List<MessageVo.MessagesDTO.ToDTO> cc = messagesDTO.getCc();
-        if (ObjectUtils.isNotEmpty(cc)) {
-            for (MessageVo.MessagesDTO.ToDTO toDTO : cc) {
-                EmailMessageSend emailMessageSend = new EmailMessageSend();
-                emailMessageSend.setMessageId(messagesDTO.getId());
-                emailMessageSend.setType(SendConstant.CC);
-                emailMessageSend.setName(toDTO.getName());
-                emailMessageSend.setAddress(toDTO.getAddress());
-                emailMessageSendList.add(emailMessageSend);
-            }
-        }
-
-        // 密送人
-        List<MessageVo.MessagesDTO.ToDTO> bcc = messagesDTO.getBcc();
-        if (ObjectUtils.isNotEmpty(bcc)) {
-            for (MessageVo.MessagesDTO.ToDTO toDTO : cc) {
-                EmailMessageSend emailMessageSend = new EmailMessageSend();
-                emailMessageSend.setMessageId(messagesDTO.getId());
-                emailMessageSend.setType(SendConstant.BCC);
-                emailMessageSend.setName(toDTO.getName());
-                emailMessageSend.setAddress(toDTO.getAddress());
-                emailMessageSendList.add(emailMessageSend);
-            }
-        }
-    }
-
-    /**
-     * 下载并添加附件信息
-     */
-    private void addMessageAttachment(String email, List<EmailMessageAttachment> emailMessageAttachmentList, MessageVo.MessagesDTO messagesDTO) {
-
-        List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
-        if (ObjectUtils.isNotEmpty(attachments)) {
-            for (MessageVo.MessagesDTO.AttachmentsDTO attachment : attachments) {
-                String attachmentId = attachment.getId();
-
-                String newFileName = attachmentId + "." + FileUtil.getSuffix(attachment.getFilename());
-
-                EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
-                emailMessageAttachment.setAttachmentId(attachmentId);
-                emailMessageAttachment.setMessageId(messagesDTO.getId());
-                emailMessageAttachment.setName(attachment.getFilename());
-                emailMessageAttachment.setPath(email + "\\" + newFileName);
-                emailMessageAttachment.setSize(attachment.getEncodedSize());
-                emailMessageAttachmentList.add(emailMessageAttachment);
-
-                // 下载附件
-                try {
-                    RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(email, attachmentId, newFileName));
-                } catch (Exception e) {
-                    log.error("下载附件失败:email:{},attachmentId:{}", email, attachmentId, e);
-
-                    RedisCache.set(RedisConstant.DOWNLOAD_FAIL_FILE_KEY + email + ":" + attachmentId, emailMessageAttachment);
-                }
-
-            }
-        }
-    }
-
-    /**
      * 同步邮件进度
      */
     private void synchronizationProgress(String email, List<MessageVo.MessagesDTO> messagesDTOList) {
@@ -355,7 +278,7 @@ public class AccountServiceImpl implements IAccountService {
             emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, account));
             Assert.notNull(emailInfo, "未找到邮箱信息");
         } catch (Exception e) {
-            log.error("查找邮箱失败", e);
+            log.error("查找邮箱失败: {}", account, e);
             return;
         }
 
@@ -366,15 +289,51 @@ public class AccountServiceImpl implements IAccountService {
         EmailMessage emailMessage = this.createMessage(emailInfo.getId(), emailInfo.getEmail(), messagesDTO);
         emailMessageService.save(emailMessage);
 
-        // 保存推送人信息
-        List<EmailMessageSend> emailMessageSendList = new ArrayList<>();
-        this.addMessageSend(emailMessageSendList, messagesDTO);
-        emailMessageSendService.saveBatch(emailMessageSendList);
+        // 保存邮箱附件
+        List<EmailMessageAttachment> emailMessageAttachmentList;
+        List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
+        if (attachments == null || attachments.size() == 0) {
+            emailMessageAttachmentList = null;
+        } else {
+            emailMessageAttachmentList = attachments.stream()
+                    .map(attachment -> this.createMessageAttachment(emailMessage, attachment))
+                    .collect(Collectors.toList());
+            emailMessageAttachmentService.saveOrUpdateBatch(emailMessageAttachmentList);
+        }
+
+        // 下载正文
+        syncExecutor.execute(() -> {
+            String messageId = emailMessage.getMessageId();
+            // 正文内容
+            MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(account, messagesDTO.getId());
+            MessageDetailVo.TextDTO text = messageDetail.getText();
+            if (ObjectUtils.isNotEmpty(text)) {
+                EmailMessageContent emailMessageContent = new EmailMessageContent();
+                emailMessageContent.setMessageId(messageId);
+                emailMessageContent.setHtmlContent(text.getHtml());
+                emailMessageContentService.saveOrUpdate(emailMessageContent);
+            }
+        });
+
+        // 下载附件
+        if (emailMessageAttachmentList != null) {
+            syncExecutor.execute(() -> {
+                for (EmailMessageAttachment attachment : emailMessageAttachmentList) {
+                    String attachmentId = attachment.getAttachmentId();
+                    String path = attachment.getPath();
+
+                    // 下载附件
+                    try {
+                        RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(account, attachmentId, path));
+                        attachment.setIsDownload(true);
+                        emailMessageAttachmentService.updateById(attachment);
+                    } catch (Exception e) {
+                        log.error("下载附件失败:email:{},attachmentId:{}", account, attachmentId, e);
+                    }
+                }
+            });
+        }
 
-        // 保存附件信息
-        List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
-        this.addMessageAttachment(account, emailMessageAttachmentList, messagesDTO);
-        emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
     }
 
     /**

+ 1 - 1
src/main/java/com/fjhx/utils/EmailEngineUtil.java

@@ -120,7 +120,7 @@ public class EmailEngineUtil {
                 return false;
             }
 
-            FileOutputStream fileOutputStream = new FileOutputStream(attachmentPath + email + "\\" + fileName);
+            FileOutputStream fileOutputStream = new FileOutputStream(attachmentPath + fileName);
             download("v1/account/" + email + "/attachment/" + attachmentId, fileOutputStream);
             return true;
         } catch (Exception e) {