24282 2 лет назад
Родитель
Сommit
fa5f380804

+ 17 - 23
bladex-saas-project/new-mail/src/main/java/com/fjhx/config/TaskPoolConfig.java

@@ -1,16 +1,18 @@
 package com.fjhx.config;
 
-import cn.hutool.core.thread.ThreadUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
-import java.util.concurrent.Executor;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 线程池配置
  */
+@Slf4j
 @EnableAsync
 @Configuration
 public class TaskPoolConfig {
@@ -18,26 +20,18 @@ public class TaskPoolConfig {
     public static final String emailTaskExecutor = "emailTaskExecutor";
 
     @Bean(name = emailTaskExecutor)
-    public Executor emailTaskExecutor() {
-        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-        // 配置核心线程数
-        executor.setCorePoolSize(10);
-        // 配置最大线程数
-        executor.setMaxPoolSize(50);
-        // 配置队列大小
-        executor.setQueueCapacity(200);
-        // 缓冲队列大小
-        executor.setKeepAliveSeconds(300);
-        // 配置线程池中的线程的名称前缀
-        executor.setThreadNamePrefix("email-async-service:");
-        // 线程池对拒绝任务的处理策略:等待30秒后重新提交本线程
-        executor.setRejectedExecutionHandler((runnable, executor1) -> {
-            ThreadUtil.sleep(30 * 1000);
-            executor1.execute(runnable);
-        });
-        // 执行初始化
-        executor.initialize();
-        return executor;
+    public ThreadPoolExecutor emailTaskExecutor() {
+        return new ThreadPoolExecutor(
+                10,
+                20,
+                60,
+                TimeUnit.SECONDS,
+                new ArrayBlockingQueue<>(20),
+                (runnable, executor) -> {
+                    log.info("线程池已满,由原线程执行");
+                    runnable.run();
+                }
+        );
     }
 
 }

+ 0 - 20
bladex-saas-project/new-mail/src/main/java/com/fjhx/config/TransactionConfig.java

@@ -1,20 +0,0 @@
-package com.fjhx.config;
-
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class TransactionConfig {
-
-    // @Autowired
-    // private PlatformTransactionManager platformTransactionManager;
-    //
-    //
-    //
-    // @Bean
-    // @ConditionalOnMissingBean
-    // public TransactionTemplate transactionTemplate() {
-    //     return new TransactionTemplate(this.platformTransactionManager);
-    // }
-
-
-}

+ 3 - 0
bladex-saas-project/new-mail/src/main/java/com/fjhx/controller/MailInfoController.java

@@ -15,4 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/mailInfo")
 public class MailInfoController {
 
+
+
+
 }

+ 79 - 47
bladex-saas-project/new-mail/src/main/java/com/fjhx/service/impl/CoreServiceImpl.java

@@ -14,14 +14,12 @@ import com.fjhx.service.MailboxService;
 import com.fjhx.utils.EmailUtil;
 import com.sun.mail.imap.IMAPMessage;
 import com.sun.mail.imap.IMAPStore;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.tool.utils.ThreadUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.TransactionStatus;
 
 import javax.annotation.PostConstruct;
 import javax.mail.Folder;
@@ -32,12 +30,12 @@ import javax.mail.internet.InternetAddress;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 
 @Slf4j
 @Service
-// @AllArgsConstructor
 public class CoreServiceImpl {
 
     @Autowired
@@ -46,6 +44,7 @@ public class CoreServiceImpl {
     private MailFolderService mailFolderService;
     @Autowired
     private MailInfoService mailInfoService;
+
     // private final MailAddressService mailAddressService;
     // private final MailMessageService mailMessageService;
     // private final MailAttachmentService mailAttachmentService;
@@ -54,11 +53,11 @@ public class CoreServiceImpl {
     @Qualifier(TaskPoolConfig.emailTaskExecutor)
     private Executor emailTaskExecutor;
 
-    @Autowired
-    private PlatformTransactionManager platformTransactionManager;
-
-    @Autowired
-    private TransactionDefinition transactionDefinition;
+    // @Autowired
+    // private PlatformTransactionManager platformTransactionManager;
+    //
+    // @Autowired
+    // private TransactionDefinition transactionDefinition;
 
 
     // 累计同步次数
@@ -70,6 +69,25 @@ public class CoreServiceImpl {
     // 初始化同步邮件天数
     private static final int initDay = 7;
 
+    @AllArgsConstructor
+    class Task implements Runnable {
+
+        private CountDownLatch countDownLatch;
+        private Mailbox mailbox;
+
+        @Override
+        public void run() {
+            try {
+                synchronousMail(mailbox);
+            } catch (Exception e) {
+                log.error("这里出错了", e);
+            }
+
+            countDownLatch.countDown();
+            System.out.println("countDownLatch.getCount() = " + countDownLatch.getCount());
+        }
+    }
+
     @PostConstruct
     public void monitorMail() {
 
@@ -92,22 +110,20 @@ public class CoreServiceImpl {
 
         // 开启抓取邮件任务
         for (Mailbox mailbox : list) {
-            // 开启异步操作
-            emailTaskExecutor.execute(() -> {
-                try {
-                    synchronousMail(mailbox);
-                } finally {
-                    countDownLatch.countDown();
-                }
-            });
-        }
+            // System.out.println("循环了" + i++ + "次");
+            // Task task = new Task(countDownLatch, mailbox);
+            // // 开启异步操作
+            // emailTaskExecutor.execute(task);
 
-        try {
-            countDownLatch.await();
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
+            synchronousMail(mailbox);
         }
 
+        // try {
+        //     countDownLatch.await();
+        // } catch (InterruptedException e) {
+        //     throw new RuntimeException(e);
+        // }
+
         // 结束处理时间
         long end = System.currentTimeMillis();
 
@@ -133,7 +149,8 @@ public class CoreServiceImpl {
     private void synchronousMail(Mailbox mailbox) {
 
         // 获取所有文件夹
-        List<MailFolder> mailFolderList = mailFolderService.list(Wrappers.<MailFolder>lambdaQuery().eq(MailFolder::getMailboxId, mailbox));
+        List<MailFolder> mailFolderList = mailFolderService.list(
+                Wrappers.<MailFolder>lambdaQuery().eq(MailFolder::getMailboxId, mailbox.getId()));
 
         IMAPStore store = null;
 
@@ -143,7 +160,11 @@ public class CoreServiceImpl {
             // 文件夹为空,代表初始化,从官方邮箱重新拉取文件夹
             if (mailFolderList.size() == 0) {
                 mailFolderList = EmailUtil.createMailFolderList(store, mailbox.getId());
-                mailFolderService.saveBatch(mailFolderList);
+                try {
+                    mailFolderService.saveBatch(mailFolderList);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
             }
 
             // 分别拉取每个文件夹邮件
@@ -160,26 +181,35 @@ public class CoreServiceImpl {
                 }
                 try {
                     Message[] messages = folder.getMessages();
-                    List<MailInfo> mailInfoList = getMailInfoList(mailFolder, messages);
+                    if (messages.length == 0) {
+                        break;
+                    }
 
+                    IMAPMessage message = (IMAPMessage) messages[messages.length - 1];
+                    if (Objects.equals(message.getMessageID(), mailFolder.getLastMessageId())) {
+                        continue;
+                    }
 
-                    IMAPMessage message = (IMAPMessage) messages[0];
+                    List<MailInfo> mailInfoList = getMailInfoList(mailFolder, messages);
                     mailFolder.setLastMessageId(message.getMessageID());
                     mailFolder.setLastReceivedDate(message.getReceivedDate());
-
                     saveMailInfo(mailFolder, mailInfoList);
 
                 } finally {
-                    folder.close();
+                    if (folder.isOpen()) {
+                        folder.close();
+                    }
                 }
             }
 
         } catch (Exception e) {
-            log.error("链接imap出错,邮箱信息:{}", JSON.toJSONString(mailbox));
+            log.error("链接imap出错,邮箱信息:{}", JSON.toJSONString(mailbox), e);
         } finally {
             if (store != null) {
                 try {
-                    store.close();
+                    if (store.isConnected()) {
+                        store.close();
+                    }
                 } catch (MessagingException e) {
                     log.error("store关闭失败", e);
                 }
@@ -207,7 +237,7 @@ public class CoreServiceImpl {
                     break;
                 }
             }
-            if (lastReceivedDate.before(receivedDate)) {
+            if (receivedDate.before(lastReceivedDate)) {
                 break;
             }
 
@@ -221,9 +251,11 @@ public class CoreServiceImpl {
             mailInfo.setFolderName(mailFolder.getName());
 
             InternetAddress internetAddress = (InternetAddress) message.getSender();
-            mailInfo.setFromEmail(internetAddress.getAddress());
-            mailInfo.setFromPersonalName(internetAddress.getPersonal());
-            mailInfo.setFromType(internetAddress.getType());
+            if (internetAddress != null) {
+                mailInfo.setFromEmail(internetAddress.getAddress());
+                mailInfo.setFromPersonalName(internetAddress.getPersonal());
+                mailInfo.setFromType(internetAddress.getType());
+            }
             mailInfo.setSendDate(receivedDate);
             mailInfo.setCreateTime(new Date());
             mailInfoList.add(0, mailInfo);
@@ -238,19 +270,19 @@ public class CoreServiceImpl {
      * 保存邮件数据
      */
     private void saveMailInfo(MailFolder mailFolder, List<MailInfo> mailInfoList) {
-        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
-        try {
-
-            mailFolderService.updateById(mailFolder);
-            mailInfoService.saveBatch(mailInfoList);
-
-            // 事务提交
-            platformTransactionManager.commit(transactionStatus);
-        } catch (Exception e) {
-            log.error("同步邮箱发生错误", e);
-            // 事务回滚
-            platformTransactionManager.rollback(transactionStatus);
-        }
+        // TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
+        // try {
+
+        mailFolderService.updateById(mailFolder);
+        mailInfoService.saveBatch(mailInfoList);
+
+        // 事务提交
+        //     platformTransactionManager.commit(transactionStatus);
+        // } catch (Exception e) {
+        //     log.error("同步邮箱发生错误", e);
+        //     // 事务回滚
+        //     platformTransactionManager.rollback(transactionStatus);
+        // }
     }
 
     // 添加同步邮件数量

+ 11 - 5
bladex-saas-project/new-mail/src/main/java/com/fjhx/utils/EmailUtil.java

@@ -10,17 +10,19 @@ import org.springblade.core.tool.utils.StringPool;
 import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.Session;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.StringJoiner;
+import java.util.*;
 
 public class EmailUtil {
 
     private static final Properties props = new Properties();
-
+    private static final HashMap<String, String> map = new HashMap<>();
     static {
         props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+
+        map.put("name", "fjhx");
+        map.put("version", "1.0.0");
+        map.put("vendor", "myClient");
+        map.put("support-email", "fjhx@fjhx.com");
     }
 
     /**
@@ -30,6 +32,7 @@ public class EmailUtil {
         Session session = Session.getInstance(props);
         IMAPStore store = (IMAPStore) session.getStore("imap");
         store.connect(host, 993, user, password);
+        store.id(map);
         return store;
     }
 
@@ -44,6 +47,9 @@ public class EmailUtil {
         return mailFolderList;
     }
 
+    /**
+     * 获取标签
+     */
     public static String getFlags(Flags flags) {
         if (flags == null) {
             return StringPool.EMPTY;