From a0cff20da8e7f2cceaf0e18a2d102df278f41026 Mon Sep 17 00:00:00 2001 From: duwenyuan <15600000461@163.com> Date: Tue, 15 Jul 2025 17:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E5=8F=91=E9=80=81=E6=97=A5=E6=9C=9F=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=E3=80=81=E8=8E=B7=E5=8F=96=E9=82=AE=E4=BB=B6=E6=8E=A5?= =?UTF-8?q?=E5=8F=97=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spectrum/SpectrumParsingActuator.java | 96 +++++++++---------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/SpectrumParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/SpectrumParsingActuator.java index 992b11f8..d26c310a 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/SpectrumParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/SpectrumParsingActuator.java @@ -2,14 +2,9 @@ package org.jeecg.modules.spectrum; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.StringPool; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.LineIterator; -import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.RedisConstant; import org.jeecg.common.constant.StringConstant; import org.jeecg.common.email.EmailLogEvent; @@ -17,30 +12,31 @@ import org.jeecg.common.email.EmailLogManager; import org.jeecg.common.email.EmailServiceManager; import org.jeecg.common.exception.DownloadEmailException; import org.jeecg.common.util.DateUtils; -import org.jeecg.common.util.Md5Util; import org.jeecg.modules.common.SpectrumUtils; import org.jeecg.modules.email.EmailProperties; import org.jeecg.modules.enums.SpectrumSource; import org.jeecg.modules.exception.AnalySpectrumException; import org.jeecg.modules.file.FileOperation; -import org.springframework.util.Base64Utils; import javax.mail.Message; import javax.mail.MessagingException; -import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.*; -import java.nio.file.Files; -import java.util.Base64; +import java.util.Date; import java.util.Objects; -import java.util.Properties; import java.util.concurrent.CountDownLatch; /** * 能谱解析 */ @Slf4j -public class SpectrumParsingActuator implements Runnable{ +public class SpectrumParsingActuator implements Runnable { + /** + * IMS2.0格式邮件判断条件 + */ + private final static String EMAIL_BEGIN = "BEGIN IMS2.0"; + private final static String MSG_TYPE = "MSG_TYPE DATA"; + private final static String EMAIL_STOP = "STOP"; /** * 邮件对象 @@ -73,9 +69,9 @@ public class SpectrumParsingActuator implements Runnable{ */ 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, - EmailCounter emailCounter,Integer batchesCounter){ + EmailCounter emailCounter, Integer batchesCounter) { this.message = message; this.emailProperties = emailProperties; this.emailServiceManager = emailServiceManager; @@ -92,39 +88,36 @@ public class SpectrumParsingActuator implements Runnable{ String receiveDate = null; try { //获取邮件主题 - subject = emailServiceManager.getMailSubject(message,this.batchesCounter); + subject = emailServiceManager.getMailSubject(message, this.batchesCounter); //解析之前先把邮件唯一信息存储到redis - String messageId = ((MimeMessage) message).getMessageID(); - if (StrUtil.isEmpty(messageId)) { - String subjectStr = message.getSubject().replace(" ", "_"); - String receivedStr = DateUtil.format(message.getReceivedDate(), DatePattern.NORM_DATETIME_MINUTE_PATTERN); - messageId = subjectStr + StringConstant.UNDER_LINE + receivedStr; - } - receiveDate = DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss"); - String emlName = subject+ StringConstant.UNDER_LINE+ receiveDate; - String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId; + String msgID = ((MimeMessage) message).getMessageID(); + String messageId = msgID == null ? emailServiceManager.getMessagesID(message, this.batchesCounter) : msgID; + Date dateUtils = message.getReceivedDate() == null ? message.getSentDate() : message.getReceivedDate(); + receiveDate = DateUtils.formatDate(dateUtils, "yyyy-MM-dd HH:mm:ss"); + String emlName = subject + StringConstant.UNDER_LINE + receiveDate; + String key = RedisConstant.EMAIL_MSG_ID + StringConstant.COLON + messageId; // spectrumServiceQuotes.getRedisUtil().set(key,emlName,expiryTime); //线程开始初始化时,初始本线程负责的能谱日志事件 - SpectrumLogManager.mailSpectrumLogManager.offer(Thread.currentThread().getId(),null); + SpectrumLogManager.mailSpectrumLogManager.offer(Thread.currentThread().getId(), null); //所有邮件都需以.eml格式存储到eml文件夹中 - final File emlFile = emailServiceManager.downloadEmailToEmlDir(message, emailCounter.getCurrValue(),this.batchesCounter); + final File emlFile = emailServiceManager.downloadEmailToEmlDir(message, emailCounter.getCurrValue(), this.batchesCounter); downloadFlag = true; //保存邮件日志到PG数据库 - this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties); + this.spectrumServiceQuotes.getMailLogService().create(message, emailProperties); //封装邮件内容 StringBuilder mailContent = new StringBuilder(); //校验邮件是否是IMS2.0协议文件,如果是设置邮件内容到mailContent变量 // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 - if(checkMailContent(mailContent,subject,emlFile)){ + if (checkMailContent(mailContent, subject, emlFile)) { AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); - spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); + spectrumHandler.init(mailContent.toString(), emlFile.getName(), spectrumServiceQuotes, new StringBuilder(), SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(), batchesCounter); final boolean matchResult = spectrumHandler.saveEmailToLocal(); - if(matchResult){ + if (matchResult) { try { //开始解析 spectrumHandler.handler(); @@ -133,44 +126,46 @@ public class SpectrumParsingActuator implements Runnable{ //如果是gamma谱的分析异常 if (e instanceof AnalySpectrumException) { // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ + if (Objects.nonNull(emlFile) && emlFile.exists()) { moveEmail(emlFile, key); } //删除邮件 - emailServiceManager.removeMail(message,batchesCounter); + emailServiceManager.removeMail(message, batchesCounter); } else { throw e; } } - }else{ - log.warn("This email {} parsing failed and is not listed in the Met, Alert, SOH, Sample, Detbkphd, QC, Gasbkphd spectra.",subject); + } else { + log.warn("This email {} parsing failed and is not listed in the Met, Alert, SOH, Sample, Detbkphd, QC, Gasbkphd spectra.", subject); } - emailServiceManager.removeMail(message,batchesCounter); + emailServiceManager.removeMail(message, batchesCounter); } else { //判断当前key的下载次数是否超过限制次数 spectrumServiceQuotes.getRedisUtil().incr(key, 1L); spectrumServiceQuotes.getRedisUtil().expire(key, expiryTime); // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ + if (Objects.nonNull(emlFile) && emlFile.exists()) { moveEmail(emlFile, key); - throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); + throw new DownloadEmailException("邮件内容校验失败,邮件移走后手动抛出CheckMailContentException"); } } } catch (Exception e) { - // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 - if(!(e instanceof DownloadEmailException) && downloadFlag){ - log.error("Catch Remove Email:"+ subject + StringPool.UNDERSCORE + receiveDate + StringPool.UNDERSCORE); - emailServiceManager.removeMail(message,batchesCounter); - } //输出异常信息 log.error("邮件处理异常{},邮件主题:{}:", e, subject); - }finally { + // todo 需要解决其他异常会进入if 删除邮件 + // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 + if (!(e instanceof DownloadEmailException) && downloadFlag) { + log.error("Catch Remove Email:" + subject + StringPool.UNDERSCORE + receiveDate + StringPool.UNDERSCORE); + emailServiceManager.removeMail(message, batchesCounter); + } + + } finally { try { - EmailLogEvent expungeEvent = new EmailLogEvent(this.batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,EmailLogManager.DONE); - EmailLogManager.getInstance().offer(Thread.currentThread().getId(),expungeEvent); + EmailLogEvent expungeEvent = new EmailLogEvent(this.batchesCounter, Thread.currentThread().getId(), EmailLogManager.GS_TYPE_GET, EmailLogManager.DONE); + EmailLogManager.getInstance().offer(Thread.currentThread().getId(), expungeEvent); EmailLogManager.getInstance().writeLog(Thread.currentThread().getId()); - }finally { + } finally { this.taskLatch.countDown(); } } @@ -178,6 +173,7 @@ public class SpectrumParsingActuator implements Runnable{ /** * 校验邮件内容是否符合IMS2.0格式 + * * @param mailContent * @param subject * @param emlFile @@ -185,15 +181,15 @@ public class SpectrumParsingActuator implements Runnable{ * @throws IOException * @throws MessagingException */ - private boolean checkMailContent(StringBuilder mailContent,String subject,File emlFile) throws IOException, MessagingException { - return SpectrumUtils.checkMailContent(mailContent,subject,emlFile,SpectrumSource.FORM_EMAIL_SERVICE.getSourceType()); + private boolean checkMailContent(StringBuilder mailContent, String subject, File emlFile) throws IOException, MessagingException { + return SpectrumUtils.checkMailContent(mailContent, subject, emlFile, SpectrumSource.FORM_EMAIL_SERVICE.getSourceType()); } private void moveEmail(File emlFile, String key) throws IOException { final String rootPath = spectrumServiceQuotes.getSpectrumPathProperties().getRootPath(); final String emlErrorPath = spectrumServiceQuotes.getSpectrumPathProperties().getEmlErrorPath(); - final String finalPath = rootPath+emlErrorPath; - FileOperation.moveFile(emlFile,finalPath,true); + final String finalPath = rootPath + emlErrorPath; + FileOperation.moveFile(emlFile, finalPath, true); // 删除 key,防止下次线程执行删除邮件 // spectrumServiceQuotes.getRedisUtil().del(key); }