fix:1.修改邮件删除失败问题

This commit is contained in:
panbaolin 2024-01-17 08:55:09 +08:00
parent f9211a5bac
commit 749559ad19
7 changed files with 52 additions and 24 deletions

View File

@ -44,7 +44,7 @@ public interface RedisConstant {
/** /**
* 删除失败邮件KEY * 删除失败邮件KEY
*/ */
String DELETE_FAIL_EMAILS = "delete_fail_emails"; String EMAIL_MSG_ID = "email_msg_id";
String UNDEAL_FILE = "Undeal:"; String UNDEAL_FILE = "Undeal:";
} }

View File

@ -576,8 +576,6 @@ public class EmailServiceManager {
} catch (MessagingException | UnsupportedEncodingException e) { } catch (MessagingException | UnsupportedEncodingException e) {
status = EmailLogManager.STATUS_ERROR; status = EmailLogManager.STATUS_ERROR;
log.error("Email deletion failed, the subject of the email is :{}, the reason is :{}.",subject,e.getMessage()); log.error("Email deletion failed, the subject of the email is :{}, the reason is :{}.",subject,e.getMessage());
String emlName = subject+StringConstant.UNDER_LINE+DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss");
redisUtil.hset(RedisConstant.DELETE_FAIL_EMAILS,Md5Util.md5Encode(emlName,"UTF-8"),emlName);
e.printStackTrace(); e.printStackTrace();
}finally { }finally {
EmailLogEvent removeEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.DELETEID,subject,receivedDate); EmailLogEvent removeEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.DELETEID,subject,receivedDate);
@ -591,15 +589,21 @@ public class EmailServiceManager {
/** /**
* 关闭邮件服务连接资源 * 关闭邮件服务连接资源
*/ */
public void close(){ public void close(List<String> messageIds){
try { try {
if(null != folder){ if(null != folder){
folder.close(true); folder.expunge();
folder.close();
} }
if(null != store){ if(null != store){
store.close(); store.close();
} }
for(String messageId : messageIds){
String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId;
redisUtil.del(key);
}
} catch (MessagingException e) { } catch (MessagingException e) {
log.error("Email closure failed, email address is: {}, reason is: {}",email.getUsername(),e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -609,20 +613,17 @@ public class EmailServiceManager {
* 若此次获取的邮件是上次删除失败的邮件直接删除 * 若此次获取的邮件是上次删除失败的邮件直接删除
* @param message * @param message
*/ */
public boolean check(Message message){ public boolean check(Message message,String messageId){
boolean exist = false; boolean exist = false;
try { try {
String subject = MimeUtility.decodeText(message.getSubject()); String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId;
Date receivedDate = message.getReceivedDate(); exist = redisUtil.hasKey(key);
String emlName = subject+StringConstant.UNDER_LINE+DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss");
exist = redisUtil.hHasKey(RedisConstant.DELETE_FAIL_EMAILS,Md5Util.md5Encode(emlName,"UTF-8"));
if(exist){ if(exist){
message.setFlag(Flags.Flag.DELETED,true); message.setFlag(Flags.Flag.DELETED,true);
redisUtil.hdel(RedisConstant.DELETE_FAIL_EMAILS,Md5Util.md5Encode(emlName,"UTF-8"));
}
} catch (MessagingException | UnsupportedEncodingException e) {
return exist;
} }
return exist; return exist;
} catch (MessagingException e) {
return false;
}
} }
} }

View File

@ -2,6 +2,8 @@ package org.jeecg.modules;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.constant.StringConstant;
import org.jeecg.common.email.EmailServiceManager; import org.jeecg.common.email.EmailServiceManager;
import org.jeecg.common.properties.TaskProperties; import org.jeecg.common.properties.TaskProperties;
import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.RedisUtil;
@ -57,7 +59,9 @@ public class AutoProcessManager{
final MailServerMonitor monitorThread = new MailServerMonitor(); final MailServerMonitor monitorThread = new MailServerMonitor();
monitorThread.setName("mail-server-monitor"); monitorThread.setName("mail-server-monitor");
monitorThread.start(); monitorThread.start();
//邮箱执行线程前给redis中添加一个default key及default value便于查看及排查
String defaultKey = RedisConstant.EMAIL_MSG_ID+ StringConstant.COLON+"default";
redisUtil.set(defaultKey,"default");
//邮件执行线程管理 //邮件执行线程管理
final MailExecManager autoProcessThread = new MailExecManager(); final MailExecManager autoProcessThread = new MailExecManager();
autoProcessThread.setName("mail-exec-thread-manage"); autoProcessThread.setName("mail-exec-thread-manage");

View File

@ -12,7 +12,11 @@ import org.jeecg.modules.spectrum.SpectrumParsingActuator;
import org.jeecg.modules.spectrum.SpectrumServiceQuotes; import org.jeecg.modules.spectrum.SpectrumServiceQuotes;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
import javax.mail.Message; import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
/** /**
@ -61,16 +65,21 @@ public class EmailParsingActuator extends Thread{
final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance();
emailServiceManager.init(this.emailProperties,this.taskProperties.getReceiveNum(),this.taskProperties.getTemporaryStoragePath(), emailServiceManager.init(this.emailProperties,this.taskProperties.getReceiveNum(),this.taskProperties.getTemporaryStoragePath(),
this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(),spectrumServiceQuotes.getRedisUtil()); this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(),spectrumServiceQuotes.getRedisUtil());
List<String> messageIds = new ArrayList<>();
try { try {
Message[] messages = emailServiceManager.receiveMail(); Message[] messages = emailServiceManager.receiveMail();
if(ArrayUtils.isNotEmpty(messages)){ if(ArrayUtils.isNotEmpty(messages)){
//检验获取的邮件是否在之前删除失败列表中若在直接调用邮件API删除并且此次数组里元素也删除 //检验获取的邮件是否在之前删除失败列表中若在直接调用邮件API删除并且此次数组里元素也删除
for(int i=messages.length-1;i>=0;i--){ for(int i=messages.length-1;i>=0;i--){
final boolean exist = emailServiceManager.check(messages[i]); if (!messages[i].isExpunged()){
String messageId = ((MimeMessage) messages[i]).getMessageID();
final boolean exist = emailServiceManager.check(messages[i],messageId);
messageIds.add(messageId);
if(exist){ if(exist){
messages = ArrayUtils.remove(messages,i); messages = ArrayUtils.remove(messages,i);
} }
} }
}
CountDownLatch taskLatch = new CountDownLatch(messages.length); CountDownLatch taskLatch = new CountDownLatch(messages.length);
for(Message message : messages){ for(Message message : messages){
SpectrumParsingActuator spectrumParsingActuator = new SpectrumParsingActuator(); SpectrumParsingActuator spectrumParsingActuator = new SpectrumParsingActuator();
@ -80,9 +89,9 @@ public class EmailParsingActuator extends Thread{
} }
taskLatch.await(); taskLatch.await();
} }
}catch (InterruptedException e) { }catch (InterruptedException | MessagingException e) {
e.printStackTrace(); e.printStackTrace();
}finally { } finally {
//清除本批次邮件日志缓存 //清除本批次邮件日志缓存
EmailLogManager.getInstance().clear(); EmailLogManager.getInstance().clear();
//保存本批次所有能谱日志 //保存本批次所有能谱日志
@ -90,7 +99,7 @@ public class EmailParsingActuator extends Thread{
//清除本批次能谱日志缓存 //清除本批次能谱日志缓存
SpectrumLogManager.mailSpectrumLogManager.clear(); SpectrumLogManager.mailSpectrumLogManager.clear();
//关闭资源 //关闭资源
emailServiceManager.close(); emailServiceManager.close(messageIds);
} }
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long sleepTime = taskProperties.getMailThreadExecCycle() - (end-start); long sleepTime = taskProperties.getMailThreadExecCycle() - (end-start);

View File

@ -52,7 +52,7 @@ public class FileSourceHandleManager{
public void init(){ public void init(){
//获取机器可用核心数 //获取机器可用核心数
int systemCores = Runtime.getRuntime().availableProcessors(); int systemCores = spectrumServiceQuotes.getMaximumPoolSizeProperties().getAuto();
int maximumPoolSize = taskProperties.getFilesourceDirReceiveNum() > systemCores?taskProperties.getFilesourceDirReceiveNum():systemCores; int maximumPoolSize = taskProperties.getFilesourceDirReceiveNum() > systemCores?taskProperties.getFilesourceDirReceiveNum():systemCores;
//初始化线程池 //初始化线程池

View File

@ -53,7 +53,7 @@ public class UndealHandleManager{
public void init(){ public void init(){
//获取机器可用核心数 //获取机器可用核心数
int systemCores = Runtime.getRuntime().availableProcessors(); int systemCores = spectrumServiceQuotes.getMaximumPoolSizeProperties().getAuto();
int maximumPoolSize = taskProperties.getUndealDirReceiveNum() > systemCores?taskProperties.getUndealDirReceiveNum():systemCores; int maximumPoolSize = taskProperties.getUndealDirReceiveNum() > systemCores?taskProperties.getUndealDirReceiveNum():systemCores;
//初始化线程池 //初始化线程池

View File

@ -3,12 +3,16 @@ package org.jeecg.modules.spectrum;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.constant.StringConstant;
import org.jeecg.common.email.EmailLogEvent; import org.jeecg.common.email.EmailLogEvent;
import org.jeecg.common.email.EmailLogManager; import org.jeecg.common.email.EmailLogManager;
import org.jeecg.common.email.EmailServiceManager; import org.jeecg.common.email.EmailServiceManager;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.email.EmailProperties; import org.jeecg.modules.email.EmailProperties;
import org.jeecg.modules.enums.SpectrumSource; import org.jeecg.modules.enums.SpectrumSource;
import javax.mail.Message; import javax.mail.Message;
import javax.mail.internet.MimeMessage;
import java.io.File; import java.io.File;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
@ -49,6 +53,10 @@ public class SpectrumParsingActuator implements Runnable{
* 邮件计数器 * 邮件计数器
*/ */
private EmailCounter emailCounter; private EmailCounter emailCounter;
/**
* 一天秒数
*/
private final int expiryTime = 86400;
public void init(Message message, EmailProperties emailProperties,EmailServiceManager emailServiceManager, public void init(Message message, EmailProperties emailProperties,EmailServiceManager emailServiceManager,
CountDownLatch taskLatch, SpectrumServiceQuotes spectrumServiceQuotes, CountDownLatch taskLatch, SpectrumServiceQuotes spectrumServiceQuotes,
@ -65,11 +73,17 @@ public class SpectrumParsingActuator implements Runnable{
public void run() { public void run() {
String subject = null; String subject = null;
try { try {
//线程开始初始化时初始本线程负责的能谱日志事件
SpectrumLogManager.mailSpectrumLogManager.offer(Thread.currentThread().getId(),null);
//获取邮件主题 //获取邮件主题
subject = emailServiceManager.getMailSubject(message); subject = emailServiceManager.getMailSubject(message);
//解析之前先把邮件唯一信息存储到redis
String messageId = ((MimeMessage) message).getMessageID();
String emlName = subject+ StringConstant.UNDER_LINE+ DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss");
String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId;
spectrumServiceQuotes.getRedisUtil().set(key,emlName,expiryTime);
//线程开始初始化时初始本线程负责的能谱日志事件
SpectrumLogManager.mailSpectrumLogManager.offer(Thread.currentThread().getId(),null);
//所有邮件都需以.eml格式存储到eml文件夹中 //所有邮件都需以.eml格式存储到eml文件夹中
final File emlFile = emailServiceManager.downloadEmailToEmlDir(message, emailCounter.getCurrValue()); final File emlFile = emailServiceManager.downloadEmailToEmlDir(message, emailCounter.getCurrValue());
//保存邮件日志到PG数据库 //保存邮件日志到PG数据库