fix:1.修改邮件删除失败问题
This commit is contained in:
parent
f9211a5bac
commit
749559ad19
|
@ -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:";
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
//初始化线程池
|
//初始化线程池
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
//初始化线程池
|
//初始化线程池
|
||||||
|
|
|
@ -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数据库
|
||||||
|
|
Loading…
Reference in New Issue
Block a user