From df16ed12a81254a32a1d4fccecb5c628c88d324f Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Wed, 24 Apr 2024 16:45:49 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=B0=E6=96=B0=E7=9A=84=E5=88=86=E6=94=AF?= =?UTF-8?q?onlyDownload=EF=BC=8C=E6=B5=8B=E8=AF=95=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/email/EmailServiceManager.java | 144 +++++++++--------- .../org/jeecg/modules/AutoProcessManager.java | 6 +- .../jeecg/modules/EmailParsingActuator.java | 14 +- .../spectrum/SpectrumParsingActuator.java | 82 +++++----- .../jeecg/JeecgAutoProcessApplication.java | 4 +- 5 files changed, 131 insertions(+), 119 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index f4f8b334..c5a1be52 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -66,6 +66,8 @@ public class EmailServiceManager { private RedisUtil redisUtil; + private Object receive; + private Object downloadEmlLocal = new Object(); @NotNull @@ -87,7 +89,7 @@ public class EmailServiceManager { */ public void init(SysEmail email, Integer receiveNum, String temporaryStoragePath, Date systemStartupTime, SpectrumPathProperties pathProperties,TaskProperties taskProperties, - RedisUtil redisUtil){ + RedisUtil redisUtil, Object receive){ this.email = email; this.receiveNum = receiveNum; this.temporaryStoragePath = temporaryStoragePath; @@ -95,6 +97,7 @@ public class EmailServiceManager { this.spectrumPathProperties = pathProperties; this.taskProperties = taskProperties; this.redisUtil = redisUtil; + this.receive = receive; } /** @@ -125,77 +128,79 @@ public class EmailServiceManager { * 接收邮件 */ public Message[] receiveMail() { - String status = EmailLogManager.STATUS_SUCCESS; - try{ - //配置邮件服务属性 - Properties properties = new Properties(); - properties.put("mail.store.protocol", "imap"); - properties.put("mail.imap.host", email.getEmailServerAddress()); - properties.put("mail.imap.port",email.getPort()); - if (email.getIsQiye() == 1) { - properties.put("mail.imap.ssl.enable", "true"); - } else { - properties.put("mail.imap.ssl.enable", "false"); - } - - HashMap IAM = new HashMap(); - //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 - IAM.put("name","myname"); - IAM.put("version","1.0.0"); - IAM.put("vendor","myclient"); - IAM.put("support-email","testmail@test.com"); - - //获取邮件回话 - final Session session = Session.getDefaultInstance(properties); - - - //获取smtp协议的存储对象 - store = (IMAPStore) session.getStore(); - //连接 - store.connect(email.getUsername(),email.getPassword()); - // 解决163普通邮箱无法建立连接问题 - store.id(IAM); - //获取收件箱 - folder = store.getFolder("INBOX");//INBOX - folder.open(Folder.READ_WRITE); - //如果邮箱邮件数量 > 0 - final int messageCount = folder.getMessageCount(); - if(messageCount > 0){ - Message[] messages = null; - if(Objects.isNull(this.systemStartupTime)){ - int finalNum = messageCount > this.receiveNum?this.receiveNum:messageCount; - //邮箱邮件下标是从1开始的 - return folder.getMessages(1,finalNum); + synchronized (receive) { + String status = EmailLogManager.STATUS_SUCCESS; + try{ + //配置邮件服务属性 + Properties properties = new Properties(); + properties.put("mail.store.protocol", "imap"); + properties.put("mail.imap.host", email.getEmailServerAddress()); + properties.put("mail.imap.port",email.getPort()); + if (email.getIsQiye() == 1) { + properties.put("mail.imap.ssl.enable", "true"); + } else { + properties.put("mail.imap.ssl.enable", "false"); } - SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE,this.systemStartupTime); - messages = folder.search(searchTerm); - Arrays.sort(messages, (o1, o2) -> { - try { - return o1.getReceivedDate().compareTo(o2.getReceivedDate()); - } catch (MessagingException e) { - e.printStackTrace(); + + HashMap IAM = new HashMap(); + //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 + IAM.put("name","myname"); + IAM.put("version","1.0.0"); + IAM.put("vendor","myclient"); + IAM.put("support-email","testmail@test.com"); + + //获取邮件回话 + final Session session = Session.getDefaultInstance(properties); + + + //获取smtp协议的存储对象 + store = (IMAPStore) session.getStore(); + //连接 + store.connect(email.getUsername(),email.getPassword()); + // 解决163普通邮箱无法建立连接问题 + store.id(IAM); + //获取收件箱 + folder = store.getFolder("INBOX");//INBOX + folder.open(Folder.READ_WRITE); + //如果邮箱邮件数量 > 0 + final int messageCount = folder.getMessageCount(); + if(messageCount > 0){ + Message[] messages = null; + if(Objects.isNull(this.systemStartupTime)){ + int finalNum = messageCount > this.receiveNum?this.receiveNum:messageCount; + //邮箱邮件下标是从1开始的 + return folder.getMessages(1,finalNum); + } + SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE,this.systemStartupTime); + messages = folder.search(searchTerm); + Arrays.sort(messages, (o1, o2) -> { + try { + return o1.getReceivedDate().compareTo(o2.getReceivedDate()); + } catch (MessagingException e) { + e.printStackTrace(); + } + return 0; + }); + if(this.receiveNum >= messages.length){ + return messages; + }else{ + return Arrays.copyOfRange(messages,0,this.receiveNum-1); } - return 0; - }); - if(this.receiveNum >= messages.length){ - return messages; - }else{ - return Arrays.copyOfRange(messages,0,this.receiveNum-1); } + }catch (MessagingException e){ + status = EmailLogManager.STATUS_ERROR; + log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); + e.printStackTrace(); + return null; + }finally { + EmailLogEvent connectEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,email,status,EmailLogManager.CONNECT); + EmailLogManager.getInstance().setConnectLogEvent(connectEvent); + //GetAllId C++原业务是把远程邮箱邮件同步到C++,本次java编写没有这一步,所以和Connect绑定,若Connect成功则GetAllId成功 + EmailLogEvent getAllEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETALLID); + EmailLogManager.getInstance().setGetAllIdLogEvent(getAllEvent); } - }catch (MessagingException e){ - status = EmailLogManager.STATUS_ERROR; - log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); - e.printStackTrace(); return null; - }finally { - EmailLogEvent connectEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,email,status,EmailLogManager.CONNECT); - EmailLogManager.getInstance().setConnectLogEvent(connectEvent); - //GetAllId C++原业务是把远程邮箱邮件同步到C++,本次java编写没有这一步,所以和Connect绑定,若Connect成功则GetAllId成功 - EmailLogEvent getAllEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETALLID); - EmailLogManager.getInstance().setGetAllIdLogEvent(getAllEvent); } - return null; } /* @@ -532,7 +537,7 @@ public class EmailServiceManager { File emlFile = null; String status = EmailLogManager.STATUS_SUCCESS; Date receivedDate = null; - FileOutputStream outputStream = null; + BufferedOutputStream outputStream = null; try { //获取发件人 final String address = ((InternetAddress) message.getFrom()[0]).getAddress(); @@ -566,9 +571,10 @@ public class EmailServiceManager { final String rootPath = spectrumPathProperties.getRootPath(); final String emlPath = spectrumPathProperties.getEmlPath(); emlFile = new File(rootPath+emlPath+File.separator+fileName); - outputStream = new FileOutputStream(emlFile); + outputStream = new BufferedOutputStream(new FileOutputStream(emlFile)); message.writeTo(outputStream); - + // 刷新缓冲区内容存入内存 + outputStream.flush(); // int bufferSize = 1024 * 1024; // 1M // InputStream inputStream = message.getInputStream(); // BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, bufferSize); diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index 3a0880dd..9fea1237 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -37,6 +37,10 @@ public class AutoProcessManager{ * 邮件Map数据锁 */ private final Object lock = new Object(); + /** + * 邮箱接收邮件锁 + */ + private final Object receive = new Object(); /** * 以邮件Id为key,邮件信息为value */ @@ -99,7 +103,7 @@ public class AutoProcessManager{ boolean testFlag = emailServiceManager.testConnectEmailServer(); if(testFlag){ EmailParsingActuator emailParsingActuator = new EmailParsingActuator(); - emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime); + emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime, receive); emailParsingActuator.setName(next.getUsername()+"-email-monitor"); emailParsingActuator.start(); //把邮件监测执行线程加入管理队列 diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 737b53c8..fd8ae856 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -36,18 +36,20 @@ public class EmailParsingActuator extends Thread{ private SpectrumServiceQuotes spectrumServiceQuotes; private EmailCounter emailCounter; private Date systemStartupTime; + private Object receive; @Setter @Getter private boolean isStop; @Setter @Getter private Date stopTime; public void init(EmailProperties emailProperties,SpectrumServiceQuotes spectrumServiceQuotes, - EmailCounter emailCounter,Date systemStartupTime){ + EmailCounter emailCounter,Date systemStartupTime, Object receive){ this.emailProperties = emailProperties; this.spectrumServiceQuotes = spectrumServiceQuotes; this.taskProperties = spectrumServiceQuotes.getTaskProperties(); this.emailCounter = emailCounter; this.systemStartupTime = systemStartupTime; + this.receive = receive; //获取机器可用核心数 int systemCores = spectrumServiceQuotes.getMaximumPoolSizeProperties().getAuto(); @@ -74,7 +76,7 @@ public class EmailParsingActuator extends Thread{ long start = System.currentTimeMillis(); final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); emailServiceManager.init(this.emailProperties,this.taskProperties.getReceiveNum(),this.taskProperties.getTemporaryStoragePath(), - this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(), spectrumServiceQuotes.getTaskProperties(), spectrumServiceQuotes.getRedisUtil()); + this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(), spectrumServiceQuotes.getTaskProperties(), spectrumServiceQuotes.getRedisUtil(), receive); List messageIds = new ArrayList<>(); try { Message[] messages = emailServiceManager.receiveMail(); @@ -84,11 +86,11 @@ public class EmailParsingActuator extends Thread{ for(int i=messages.length-1;i>=0;i--){ if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); - final boolean exist = emailServiceManager.check(messages[i],messageId); +// final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); - if(exist){ - messages = ArrayUtils.remove(messages,i); - } +// if(exist){ +// messages = ArrayUtils.remove(messages,i); +// } } } log.info("EmailParsingActuator本次真实执行邮件数量为:{}",messages.length); 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 a88f07ad..aa9ba619 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 @@ -110,47 +110,47 @@ public class SpectrumParsingActuator implements Runnable{ //保存邮件日志到PG数据库 this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties); - //获取邮件内容 - StringBuilder mailContent = new StringBuilder(); - if(Objects.nonNull(emlFile) && emlFile.length() > 0){ - mailContent.append(FileUtil.readUtf8String(emlFile)); - } - - //判断是否是IMS2.0协议文件 - // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 - if(checkMailContent(mailContent,subject)){ - AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); - spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); - final boolean matchResult = spectrumHandler.saveEmailToLocal(); - if(matchResult){ - try { - //开始解析 - spectrumHandler.handler(); - spectrumServiceQuotes.getRedisUtil().del(key); - } catch (Exception e) { - //如果是gamma谱的分析异常 - if (e instanceof AnalySpectrumException) { - // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ - moveEmail(emlFile, key); - } - //删除邮件 - 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); - } - emailServiceManager.removeMail(message,batchesCounter); - }else { - // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ - moveEmail(emlFile, key); - throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); - } - } +// //获取邮件内容 +// StringBuilder mailContent = new StringBuilder(); +// if(Objects.nonNull(emlFile) && emlFile.length() > 0){ +// mailContent.append(FileUtil.readUtf8String(emlFile)); +// } +// +// //判断是否是IMS2.0协议文件 +// // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 +// if(checkMailContent(mailContent,subject)){ +// AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); +// spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); +// final boolean matchResult = spectrumHandler.saveEmailToLocal(); +// if(matchResult){ +// try { +// //开始解析 +// spectrumHandler.handler(); +// spectrumServiceQuotes.getRedisUtil().del(key); +// } catch (Exception e) { +// //如果是gamma谱的分析异常 +// if (e instanceof AnalySpectrumException) { +// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError +// if (Objects.nonNull(emlFile) && emlFile.exists()){ +// moveEmail(emlFile, key); +// } +// //删除邮件 +// 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); +// } +// emailServiceManager.removeMail(message,batchesCounter); +// }else { +// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError +// if (Objects.nonNull(emlFile) && emlFile.exists()){ +// moveEmail(emlFile, key); +// throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); +// } +// } } catch (Exception e) { // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 if(!(e instanceof DownloadEmailException) && downloadFlag){ diff --git a/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java b/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java index 853ac505..f989894e 100644 --- a/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java +++ b/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java @@ -93,8 +93,8 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im //校验存储目录是否存在,不存在则创建,存在无操作 checkStorageDirectory(); autoProcessManager.start(systemStartupTime); - undealHandleManager.start(); - fileSourceHandleManager.start(); +// undealHandleManager.start(); +// fileSourceHandleManager.start(); // 删除过期的文件 delFileManager.start(); //统计报告执行线程 From 7da8eeb921aee1b9763a309294a4ce3dc06ec57d Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Thu, 25 Apr 2024 14:26:00 +0800 Subject: [PATCH 02/16] =?UTF-8?q?onlyDownload=E6=94=BE=E5=BC=80=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/modules/EmailParsingActuator.java | 8 +- .../spectrum/SpectrumParsingActuator.java | 82 +++++++++---------- .../jeecg/JeecgAutoProcessApplication.java | 4 +- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index fd8ae856..11c83e4c 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -86,11 +86,11 @@ public class EmailParsingActuator extends Thread{ for(int i=messages.length-1;i>=0;i--){ if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); -// final boolean exist = emailServiceManager.check(messages[i],messageId); + final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); -// if(exist){ -// messages = ArrayUtils.remove(messages,i); -// } + if(exist){ + messages = ArrayUtils.remove(messages,i); + } } } log.info("EmailParsingActuator本次真实执行邮件数量为:{}",messages.length); 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 aa9ba619..a88f07ad 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 @@ -110,47 +110,47 @@ public class SpectrumParsingActuator implements Runnable{ //保存邮件日志到PG数据库 this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties); -// //获取邮件内容 -// StringBuilder mailContent = new StringBuilder(); -// if(Objects.nonNull(emlFile) && emlFile.length() > 0){ -// mailContent.append(FileUtil.readUtf8String(emlFile)); -// } -// -// //判断是否是IMS2.0协议文件 -// // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 -// if(checkMailContent(mailContent,subject)){ -// AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); -// spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); -// final boolean matchResult = spectrumHandler.saveEmailToLocal(); -// if(matchResult){ -// try { -// //开始解析 -// spectrumHandler.handler(); -// spectrumServiceQuotes.getRedisUtil().del(key); -// } catch (Exception e) { -// //如果是gamma谱的分析异常 -// if (e instanceof AnalySpectrumException) { -// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError -// if (Objects.nonNull(emlFile) && emlFile.exists()){ -// moveEmail(emlFile, key); -// } -// //删除邮件 -// 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); -// } -// emailServiceManager.removeMail(message,batchesCounter); -// }else { -// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError -// if (Objects.nonNull(emlFile) && emlFile.exists()){ -// moveEmail(emlFile, key); -// throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); -// } -// } + //获取邮件内容 + StringBuilder mailContent = new StringBuilder(); + if(Objects.nonNull(emlFile) && emlFile.length() > 0){ + mailContent.append(FileUtil.readUtf8String(emlFile)); + } + + //判断是否是IMS2.0协议文件 + // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 + if(checkMailContent(mailContent,subject)){ + AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); + spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); + final boolean matchResult = spectrumHandler.saveEmailToLocal(); + if(matchResult){ + try { + //开始解析 + spectrumHandler.handler(); + spectrumServiceQuotes.getRedisUtil().del(key); + } catch (Exception e) { + //如果是gamma谱的分析异常 + if (e instanceof AnalySpectrumException) { + // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError + if (Objects.nonNull(emlFile) && emlFile.exists()){ + moveEmail(emlFile, key); + } + //删除邮件 + 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); + } + emailServiceManager.removeMail(message,batchesCounter); + }else { + // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError + if (Objects.nonNull(emlFile) && emlFile.exists()){ + moveEmail(emlFile, key); + throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); + } + } } catch (Exception e) { // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 if(!(e instanceof DownloadEmailException) && downloadFlag){ diff --git a/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java b/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java index f989894e..853ac505 100644 --- a/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java +++ b/jeecg-server-cloud/armd-auto-process-start/src/main/java/org/jeecg/JeecgAutoProcessApplication.java @@ -93,8 +93,8 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im //校验存储目录是否存在,不存在则创建,存在无操作 checkStorageDirectory(); autoProcessManager.start(systemStartupTime); -// undealHandleManager.start(); -// fileSourceHandleManager.start(); + undealHandleManager.start(); + fileSourceHandleManager.start(); // 删除过期的文件 delFileManager.start(); //统计报告执行线程 From f62158a721519750a02474f510f1fcc6457a2ade Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Fri, 26 Apr 2024 10:31:59 +0800 Subject: [PATCH 03/16] =?UTF-8?q?onlyDownload=E4=BF=AE=E6=94=B9=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E5=A4=84=E7=90=86=E7=A8=8B=E5=BA=8F=E9=A2=91=E7=B9=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B=E9=97=AE=E9=A2=98=20onlyDo?= =?UTF-8?q?wnload=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=95=BF=E6=9C=9F=E5=A0=B5=E5=A1=9E=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/email/EmailServiceManager.java | 183 +++++++++--------- .../org/jeecg/modules/AutoProcessManager.java | 16 +- .../jeecg/modules/EmailParsingActuator.java | 19 +- .../spectrum/SpectrumParsingActuator.java | 82 ++++---- 4 files changed, 148 insertions(+), 152 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index c5a1be52..e63fbd5d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -9,6 +9,8 @@ import com.sun.mail.imap.IMAPStore; import com.sun.mail.smtp.SMTPAddressFailedException; import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.constant.RedisConstant; @@ -66,8 +68,6 @@ public class EmailServiceManager { private RedisUtil redisUtil; - private Object receive; - private Object downloadEmlLocal = new Object(); @NotNull @@ -89,7 +89,7 @@ public class EmailServiceManager { */ public void init(SysEmail email, Integer receiveNum, String temporaryStoragePath, Date systemStartupTime, SpectrumPathProperties pathProperties,TaskProperties taskProperties, - RedisUtil redisUtil, Object receive){ + RedisUtil redisUtil){ this.email = email; this.receiveNum = receiveNum; this.temporaryStoragePath = temporaryStoragePath; @@ -97,7 +97,6 @@ public class EmailServiceManager { this.spectrumPathProperties = pathProperties; this.taskProperties = taskProperties; this.redisUtil = redisUtil; - this.receive = receive; } /** @@ -128,79 +127,77 @@ public class EmailServiceManager { * 接收邮件 */ public Message[] receiveMail() { - synchronized (receive) { - String status = EmailLogManager.STATUS_SUCCESS; - try{ - //配置邮件服务属性 - Properties properties = new Properties(); - properties.put("mail.store.protocol", "imap"); - properties.put("mail.imap.host", email.getEmailServerAddress()); - properties.put("mail.imap.port",email.getPort()); - if (email.getIsQiye() == 1) { - properties.put("mail.imap.ssl.enable", "true"); - } else { - properties.put("mail.imap.ssl.enable", "false"); - } - - HashMap IAM = new HashMap(); - //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 - IAM.put("name","myname"); - IAM.put("version","1.0.0"); - IAM.put("vendor","myclient"); - IAM.put("support-email","testmail@test.com"); - - //获取邮件回话 - final Session session = Session.getDefaultInstance(properties); - - - //获取smtp协议的存储对象 - store = (IMAPStore) session.getStore(); - //连接 - store.connect(email.getUsername(),email.getPassword()); - // 解决163普通邮箱无法建立连接问题 - store.id(IAM); - //获取收件箱 - folder = store.getFolder("INBOX");//INBOX - folder.open(Folder.READ_WRITE); - //如果邮箱邮件数量 > 0 - final int messageCount = folder.getMessageCount(); - if(messageCount > 0){ - Message[] messages = null; - if(Objects.isNull(this.systemStartupTime)){ - int finalNum = messageCount > this.receiveNum?this.receiveNum:messageCount; - //邮箱邮件下标是从1开始的 - return folder.getMessages(1,finalNum); - } - SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE,this.systemStartupTime); - messages = folder.search(searchTerm); - Arrays.sort(messages, (o1, o2) -> { - try { - return o1.getReceivedDate().compareTo(o2.getReceivedDate()); - } catch (MessagingException e) { - e.printStackTrace(); - } - return 0; - }); - if(this.receiveNum >= messages.length){ - return messages; - }else{ - return Arrays.copyOfRange(messages,0,this.receiveNum-1); - } - } - }catch (MessagingException e){ - status = EmailLogManager.STATUS_ERROR; - log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); - e.printStackTrace(); - return null; - }finally { - EmailLogEvent connectEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,email,status,EmailLogManager.CONNECT); - EmailLogManager.getInstance().setConnectLogEvent(connectEvent); - //GetAllId C++原业务是把远程邮箱邮件同步到C++,本次java编写没有这一步,所以和Connect绑定,若Connect成功则GetAllId成功 - EmailLogEvent getAllEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETALLID); - EmailLogManager.getInstance().setGetAllIdLogEvent(getAllEvent); + String status = EmailLogManager.STATUS_SUCCESS; + try{ + //配置邮件服务属性 + Properties properties = new Properties(); + properties.put("mail.store.protocol", "imap"); + properties.put("mail.imap.host", email.getEmailServerAddress()); + properties.put("mail.imap.port",email.getPort()); + if (email.getIsQiye() == 1) { + properties.put("mail.imap.ssl.enable", "true"); + } else { + properties.put("mail.imap.ssl.enable", "false"); } + + HashMap IAM = new HashMap(); + //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 + IAM.put("name","myname"); + IAM.put("version","1.0.0"); + IAM.put("vendor","myclient"); + IAM.put("support-email","testmail@test.com"); + + //获取邮件回话 + final Session session = Session.getDefaultInstance(properties); + + + //获取smtp协议的存储对象 + store = (IMAPStore) session.getStore(); + //连接 + store.connect(email.getUsername(),email.getPassword()); + // 解决163普通邮箱无法建立连接问题 + store.id(IAM); + //获取收件箱 + folder = store.getFolder("INBOX");//INBOX + folder.open(Folder.READ_WRITE); + //如果邮箱邮件数量 > 0 + final int messageCount = folder.getMessageCount(); + if(messageCount > 0){ + Message[] messages = null; + if(Objects.isNull(this.systemStartupTime)){ + int finalNum = messageCount > this.receiveNum?this.receiveNum:messageCount; + //邮箱邮件下标是从1开始的 + return folder.getMessages(1,finalNum); + } + SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE,this.systemStartupTime); + messages = folder.search(searchTerm); + Arrays.sort(messages, (o1, o2) -> { + try { + return o1.getReceivedDate().compareTo(o2.getReceivedDate()); + } catch (MessagingException e) { + e.printStackTrace(); + } + return 0; + }); + if(this.receiveNum >= messages.length){ + return messages; + }else{ + return Arrays.copyOfRange(messages,0,this.receiveNum-1); + } + } + }catch (MessagingException e){ + status = EmailLogManager.STATUS_ERROR; + log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); + e.printStackTrace(); return null; + }finally { + EmailLogEvent connectEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,email,status,EmailLogManager.CONNECT); + EmailLogManager.getInstance().setConnectLogEvent(connectEvent); + //GetAllId C++原业务是把远程邮箱邮件同步到C++,本次java编写没有这一步,所以和Connect绑定,若Connect成功则GetAllId成功 + EmailLogEvent getAllEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETALLID); + EmailLogManager.getInstance().setGetAllIdLogEvent(getAllEvent); } + return null; } /* @@ -537,6 +534,7 @@ public class EmailServiceManager { File emlFile = null; String status = EmailLogManager.STATUS_SUCCESS; Date receivedDate = null; + InputStream inputStream = null; BufferedOutputStream outputStream = null; try { //获取发件人 @@ -571,26 +569,19 @@ public class EmailServiceManager { final String rootPath = spectrumPathProperties.getRootPath(); final String emlPath = spectrumPathProperties.getEmlPath(); emlFile = new File(rootPath+emlPath+File.separator+fileName); - outputStream = new BufferedOutputStream(new FileOutputStream(emlFile)); - message.writeTo(outputStream); - // 刷新缓冲区内容存入内存 - outputStream.flush(); -// int bufferSize = 1024 * 1024; // 1M -// InputStream inputStream = message.getInputStream(); -// BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, bufferSize); -// // 或者使用 BufferedOutputStream -// OutputStream outputStream = new FileOutputStream(emlFile); -// BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream, bufferSize); -// // 从邮件的输入流读取内容,并写入到本地文件 -// byte[] buffer = new byte[bufferSize]; -// int bytesRead; -// while ((bytesRead = bufferedInputStream.read(buffer)) != -1) { -// bufferedOutputStream.write(buffer, 0, bytesRead); -// } -// -// // 关闭流 -// bufferedInputStream.close(); -// bufferedOutputStream.close(); +// outputStream = new FileOutputStream(emlFile); +// message.writeTo(outputStream); + + int bufferSize = 1024 * 1024; // 1M + inputStream = message.getInputStream(); + outputStream = new BufferedOutputStream(new FileOutputStream(emlFile), bufferSize); + // 从邮件的输入流读取内容,并写入到本地文件 + byte[] buffer = new byte[bufferSize]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } catch (MessagingException | IOException e) { // 下载邮件失败 抛出自定义邮件下载异常 status = EmailLogManager.STATUS_ERROR; @@ -604,7 +595,11 @@ public class EmailServiceManager { (Objects.isNull(emlFile)?" ":emlFile.getAbsolutePath())); EmailLogManager.getInstance().offer(Thread.currentThread().getId(),event); try { + if (Objects.nonNull(inputStream)) { + inputStream.close(); + } if (Objects.nonNull(outputStream)) { + outputStream.flush(); outputStream.close(); } } catch (IOException e) { diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index 9fea1237..c9593dbf 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -37,10 +37,6 @@ public class AutoProcessManager{ * 邮件Map数据锁 */ private final Object lock = new Object(); - /** - * 邮箱接收邮件锁 - */ - private final Object receive = new Object(); /** * 以邮件Id为key,邮件信息为value */ @@ -103,7 +99,7 @@ public class AutoProcessManager{ boolean testFlag = emailServiceManager.testConnectEmailServer(); if(testFlag){ EmailParsingActuator emailParsingActuator = new EmailParsingActuator(); - emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime, receive); + emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime); emailParsingActuator.setName(next.getUsername()+"-email-monitor"); emailParsingActuator.start(); //把邮件监测执行线程加入管理队列 @@ -237,9 +233,15 @@ public class AutoProcessManager{ if(databaseEmail.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())){ final boolean testFlag = testConnectEmailServer(databaseEmail); if(testFlag){ - databaseEmail.setNewEmailFlag(true); + if (emailExecThreadMap.containsKey(databaseEmail.getId())) { + EmailParsingActuator actuator = emailExecThreadMap.get(databaseEmail.getId()); + actuator.setStop(false); + log.info("{}邮箱重新加入监测队列",databaseEmail.getUsername()); + } else { + databaseEmail.setNewEmailFlag(true); + log.info("{}邮箱加入监测队列,设置新增标记",databaseEmail.getUsername()); + } emailMap.put(databaseEmail.getId(),databaseEmail); - log.info("{}邮箱加入监测队列,设置新增标记",databaseEmail.getUsername()); } } } diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 11c83e4c..6097a1c3 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -36,20 +36,18 @@ public class EmailParsingActuator extends Thread{ private SpectrumServiceQuotes spectrumServiceQuotes; private EmailCounter emailCounter; private Date systemStartupTime; - private Object receive; @Setter @Getter private boolean isStop; @Setter @Getter private Date stopTime; public void init(EmailProperties emailProperties,SpectrumServiceQuotes spectrumServiceQuotes, - EmailCounter emailCounter,Date systemStartupTime, Object receive){ + EmailCounter emailCounter,Date systemStartupTime){ this.emailProperties = emailProperties; this.spectrumServiceQuotes = spectrumServiceQuotes; this.taskProperties = spectrumServiceQuotes.getTaskProperties(); this.emailCounter = emailCounter; this.systemStartupTime = systemStartupTime; - this.receive = receive; //获取机器可用核心数 int systemCores = spectrumServiceQuotes.getMaximumPoolSizeProperties().getAuto(); @@ -76,21 +74,21 @@ public class EmailParsingActuator extends Thread{ long start = System.currentTimeMillis(); final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); emailServiceManager.init(this.emailProperties,this.taskProperties.getReceiveNum(),this.taskProperties.getTemporaryStoragePath(), - this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(), spectrumServiceQuotes.getTaskProperties(), spectrumServiceQuotes.getRedisUtil(), receive); + this.systemStartupTime, spectrumServiceQuotes.getSpectrumPathProperties(), spectrumServiceQuotes.getTaskProperties(), spectrumServiceQuotes.getRedisUtil()); List messageIds = new ArrayList<>(); try { Message[] messages = emailServiceManager.receiveMail(); if(ArrayUtils.isNotEmpty(messages)){ - log.info("EmailParsingActuator本次获取邮件数量为:{}",messages.length); + log.info("EmailParsingActuator本次{}获取邮件数量为:{}", Thread.currentThread().getName(), messages.length); //检验获取的邮件是否在之前删除失败列表中,若在直接调用邮件API删除,并且此次数组里元素也删除 for(int i=messages.length-1;i>=0;i--){ if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); - final boolean exist = emailServiceManager.check(messages[i],messageId); +// final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); - if(exist){ - messages = ArrayUtils.remove(messages,i); - } +// if(exist){ +// messages = ArrayUtils.remove(messages,i); +// } } } log.info("EmailParsingActuator本次真实执行邮件数量为:{}",messages.length); @@ -107,11 +105,12 @@ public class EmailParsingActuator extends Thread{ taskLatch.await(); } } - }catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } catch (MessagingException e) { throw new RuntimeException(e); } finally { + log.info(Thread.currentThread().getName() +"执行完毕!!!!"); //清除本批次邮件日志缓存 EmailLogManager.getInstance().clear(); //保存本批次所有能谱日志 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 a88f07ad..aa9ba619 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 @@ -110,47 +110,47 @@ public class SpectrumParsingActuator implements Runnable{ //保存邮件日志到PG数据库 this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties); - //获取邮件内容 - StringBuilder mailContent = new StringBuilder(); - if(Objects.nonNull(emlFile) && emlFile.length() > 0){ - mailContent.append(FileUtil.readUtf8String(emlFile)); - } - - //判断是否是IMS2.0协议文件 - // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 - if(checkMailContent(mailContent,subject)){ - AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); - spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); - final boolean matchResult = spectrumHandler.saveEmailToLocal(); - if(matchResult){ - try { - //开始解析 - spectrumHandler.handler(); - spectrumServiceQuotes.getRedisUtil().del(key); - } catch (Exception e) { - //如果是gamma谱的分析异常 - if (e instanceof AnalySpectrumException) { - // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ - moveEmail(emlFile, key); - } - //删除邮件 - 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); - } - emailServiceManager.removeMail(message,batchesCounter); - }else { - // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError - if (Objects.nonNull(emlFile) && emlFile.exists()){ - moveEmail(emlFile, key); - throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); - } - } +// //获取邮件内容 +// StringBuilder mailContent = new StringBuilder(); +// if(Objects.nonNull(emlFile) && emlFile.length() > 0){ +// mailContent.append(FileUtil.readUtf8String(emlFile)); +// } +// +// //判断是否是IMS2.0协议文件 +// // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 +// if(checkMailContent(mailContent,subject)){ +// AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); +// spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); +// final boolean matchResult = spectrumHandler.saveEmailToLocal(); +// if(matchResult){ +// try { +// //开始解析 +// spectrumHandler.handler(); +// spectrumServiceQuotes.getRedisUtil().del(key); +// } catch (Exception e) { +// //如果是gamma谱的分析异常 +// if (e instanceof AnalySpectrumException) { +// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError +// if (Objects.nonNull(emlFile) && emlFile.exists()){ +// moveEmail(emlFile, key); +// } +// //删除邮件 +// 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); +// } +// emailServiceManager.removeMail(message,batchesCounter); +// }else { +// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError +// if (Objects.nonNull(emlFile) && emlFile.exists()){ +// moveEmail(emlFile, key); +// throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); +// } +// } } catch (Exception e) { // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 if(!(e instanceof DownloadEmailException) && downloadFlag){ From f94b6ca9fa2342bbbbf4f6a0cdb6a3dc1a550f69 Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Fri, 26 Apr 2024 10:33:21 +0800 Subject: [PATCH 04/16] =?UTF-8?q?onlyDownload=E4=BF=AE=E6=94=B9=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E5=A4=84=E7=90=86=E7=A8=8B=E5=BA=8F=E9=A2=91=E7=B9=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B=E9=97=AE=E9=A2=98=20onlyDo?= =?UTF-8?q?wnload=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=95=BF=E6=9C=9F=E5=A0=B5=E5=A1=9E=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/modules/EmailParsingActuator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 6097a1c3..107a0558 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -110,7 +110,6 @@ public class EmailParsingActuator extends Thread{ } catch (MessagingException e) { throw new RuntimeException(e); } finally { - log.info(Thread.currentThread().getName() +"执行完毕!!!!"); //清除本批次邮件日志缓存 EmailLogManager.getInstance().clear(); //保存本批次所有能谱日志 From 1e0d499b7a345c4891cc52d2e8085a9c342f3767 Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Mon, 29 Apr 2024 18:24:15 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=BA=BF=E7=A8=8B=E5=B7=B2=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=A7=BB=E9=99=A4emailMap=E4=B8=AD=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E7=9A=84=E9=82=AE=E7=AE=B1=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/modules/AutoProcessManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index c9593dbf..9460d44d 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -285,6 +285,7 @@ public class AutoProcessManager{ if(next.getValue().getState() == State.TERMINATED){ log.info("{}邮箱执行线程已停止,emailExecThreadMap删除此邮箱数据",next.getValue().getEmailProperties().getUsername()); checkStopThreads.remove(); + emailMap.remove(next.getKey()); } } From f58d629bd7c2609f20390e2a7b23a34fa800b48c Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Mon, 29 Apr 2024 18:29:23 +0800 Subject: [PATCH 06/16] =?UTF-8?q?onlyDownload=E5=90=8E=E7=BB=AD=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=94=BE=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spectrum/SpectrumParsingActuator.java | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 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 aa9ba619..a88f07ad 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 @@ -110,47 +110,47 @@ public class SpectrumParsingActuator implements Runnable{ //保存邮件日志到PG数据库 this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties); -// //获取邮件内容 -// StringBuilder mailContent = new StringBuilder(); -// if(Objects.nonNull(emlFile) && emlFile.length() > 0){ -// mailContent.append(FileUtil.readUtf8String(emlFile)); -// } -// -// //判断是否是IMS2.0协议文件 -// // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 -// if(checkMailContent(mailContent,subject)){ -// AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); -// spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); -// final boolean matchResult = spectrumHandler.saveEmailToLocal(); -// if(matchResult){ -// try { -// //开始解析 -// spectrumHandler.handler(); -// spectrumServiceQuotes.getRedisUtil().del(key); -// } catch (Exception e) { -// //如果是gamma谱的分析异常 -// if (e instanceof AnalySpectrumException) { -// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError -// if (Objects.nonNull(emlFile) && emlFile.exists()){ -// moveEmail(emlFile, key); -// } -// //删除邮件 -// 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); -// } -// emailServiceManager.removeMail(message,batchesCounter); -// }else { -// // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError -// if (Objects.nonNull(emlFile) && emlFile.exists()){ -// moveEmail(emlFile, key); -// throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); -// } -// } + //获取邮件内容 + StringBuilder mailContent = new StringBuilder(); + if(Objects.nonNull(emlFile) && emlFile.length() > 0){ + mailContent.append(FileUtil.readUtf8String(emlFile)); + } + + //判断是否是IMS2.0协议文件 + // 如果邮件内容校验成功 将文件保存到eml目录 并删除邮件对象 + if(checkMailContent(mailContent,subject)){ + AbstractSpectrumHandler spectrumHandler = new SamplephdSpectrum(); + spectrumHandler.init(mailContent.toString(),emlFile.getName(),spectrumServiceQuotes,new StringBuilder(),SpectrumSource.FORM_EMAIL_SERVICE.getSourceType(),batchesCounter); + final boolean matchResult = spectrumHandler.saveEmailToLocal(); + if(matchResult){ + try { + //开始解析 + spectrumHandler.handler(); + spectrumServiceQuotes.getRedisUtil().del(key); + } catch (Exception e) { + //如果是gamma谱的分析异常 + if (e instanceof AnalySpectrumException) { + // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError + if (Objects.nonNull(emlFile) && emlFile.exists()){ + moveEmail(emlFile, key); + } + //删除邮件 + 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); + } + emailServiceManager.removeMail(message,batchesCounter); + }else { + // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError + if (Objects.nonNull(emlFile) && emlFile.exists()){ + moveEmail(emlFile, key); + throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException"); + } + } } catch (Exception e) { // 如果不是下载导致的失败 并且 下载成功,则删除下载的邮件对象 if(!(e instanceof DownloadEmailException) && downloadFlag){ From 23bf9ee271f708569fdf2082c96e541bfe7fbdd9 Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Tue, 30 Apr 2024 08:56:52 +0800 Subject: [PATCH 07/16] =?UTF-8?q?onlyDownload=E5=90=8E=E7=BB=AD=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=94=BE=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/jeecg/modules/EmailParsingActuator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 107a0558..67983395 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -84,11 +84,11 @@ public class EmailParsingActuator extends Thread{ for(int i=messages.length-1;i>=0;i--){ if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); -// final boolean exist = emailServiceManager.check(messages[i],messageId); + final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); -// if(exist){ -// messages = ArrayUtils.remove(messages,i); -// } + if(exist){ + messages = ArrayUtils.remove(messages,i); + } } } log.info("EmailParsingActuator本次真实执行邮件数量为:{}",messages.length); From 72dbf2ba80d0de1f5d5322534a7b422161d09129 Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Thu, 9 May 2024 09:34:21 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=BF=AE=E6=94=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/email/EmailServiceManager.java | 9 ++++----- .../jeecg/modules/EmailParsingActuator.java | 18 ++++++++++++------ .../spectrum/SpectrumParsingActuator.java | 8 ++++---- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index e63fbd5d..a3ac56f3 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -126,7 +126,7 @@ public class EmailServiceManager { /** * 接收邮件 */ - public Message[] receiveMail() { + public Message[] receiveMail() throws MessagingException { String status = EmailLogManager.STATUS_SUCCESS; try{ //配置邮件服务属性 @@ -185,12 +185,11 @@ public class EmailServiceManager { return Arrays.copyOfRange(messages,0,this.receiveNum-1); } } - }catch (MessagingException e){ + } catch (MessagingException e){ status = EmailLogManager.STATUS_ERROR; log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); - e.printStackTrace(); - return null; - }finally { + throw e; + } finally { EmailLogEvent connectEvent = new EmailLogEvent(EmailLogManager.GS_TYPE_GET,email,status,EmailLogManager.CONNECT); EmailLogManager.getInstance().setConnectLogEvent(connectEvent); //GetAllId C++原业务是把远程邮箱邮件同步到C++,本次java编写没有这一步,所以和Connect绑定,若Connect成功则GetAllId成功 diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 67983395..2f85fe4f 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -17,10 +17,7 @@ import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.concurrent.*; /** @@ -82,8 +79,14 @@ public class EmailParsingActuator extends Thread{ log.info("EmailParsingActuator本次{}获取邮件数量为:{}", Thread.currentThread().getName(), messages.length); //检验获取的邮件是否在之前删除失败列表中,若在直接调用邮件API删除,并且此次数组里元素也删除 for(int i=messages.length-1;i>=0;i--){ + if (null == messages[i].getHeader("Message-ID")) { + System.out.println("Message ID是空值信息!!!!!!!"); + messages = ArrayUtils.remove(messages, i); + continue; + } if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); + System.out.println("正常获取到的Message ID是:"+messageId); final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); if(exist){ @@ -105,10 +108,13 @@ public class EmailParsingActuator extends Thread{ taskLatch.await(); } } - } catch (InterruptedException e) { - e.printStackTrace(); } catch (MessagingException e) { + System.out.println("捕获MessagingException!!!!!!!!"); + closeResource(); throw new RuntimeException(e); + } catch (Exception e) { + closeResource(); + log.error(""+e); } finally { //清除本批次邮件日志缓存 EmailLogManager.getInstance().clear(); 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 a88f07ad..5548ba1e 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 @@ -97,9 +97,6 @@ public class SpectrumParsingActuator implements Runnable{ String emlName = subject+ StringConstant.UNDER_LINE+ receiveDate; String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId; // spectrumServiceQuotes.getRedisUtil().set(key,emlName,expiryTime); - //判断当前key的下载次数是否超过限制次数 - spectrumServiceQuotes.getRedisUtil().incr(key, 1L); - spectrumServiceQuotes.getRedisUtil().expire(key, expiryTime); //线程开始初始化时,初始本线程负责的能谱日志事件 SpectrumLogManager.mailSpectrumLogManager.offer(Thread.currentThread().getId(),null); @@ -144,7 +141,10 @@ public class SpectrumParsingActuator implements Runnable{ 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); - }else { + } else { + //判断当前key的下载次数是否超过限制次数 + spectrumServiceQuotes.getRedisUtil().incr(key, 1L); + spectrumServiceQuotes.getRedisUtil().expire(key, expiryTime); // 如果邮件内容校验失败(邮件内容不完整) 将错误邮件从eml移动到emlError if (Objects.nonNull(emlFile) && emlFile.exists()){ moveEmail(emlFile, key); From 9151233f115cd9075c14634ebd3be0d5a963c81a Mon Sep 17 00:00:00 2001 From: orgin Date: Thu, 30 May 2024 16:48:46 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E4=B8=8D=E4=B8=AD=E6=96=AD=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/common/email/EmailServiceManager.java | 4 ++-- .../src/main/java/org/jeecg/modules/AutoProcessManager.java | 4 ++-- .../main/java/org/jeecg/modules/EmailParsingActuator.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index a3ac56f3..257b0b26 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -621,7 +621,7 @@ public class EmailServiceManager { try { subject = MimeUtility.decodeText(message.getSubject()); receivedDate = message.getReceivedDate(); - message.setFlag(Flags.Flag.DELETED,true); +// message.setFlag(Flags.Flag.DELETED,true); // log.info("EmailServiceManager: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); } catch (MessagingException | UnsupportedEncodingException e) { status = EmailLogManager.STATUS_ERROR; @@ -672,7 +672,7 @@ public class EmailServiceManager { if(numberKey >= taskProperties.getForceDeletedNumber()){ exist = true; log.info("Check: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); - message.setFlag(Flags.Flag.DELETED,true); +// message.setFlag(Flags.Flag.DELETED,true); redisUtil.del(key); } return exist; diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index 9460d44d..d62ad50e 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -290,7 +290,7 @@ public class AutoProcessManager{ } //遍历邮箱执行线程,如果邮箱执行线程stop属性已被设置为true则关闭资源停止线程 - final Iterator> iterator = emailExecThreadMap.entrySet().iterator(); + /*final Iterator> iterator = emailExecThreadMap.entrySet().iterator(); emailExecThreadMap.forEach((emailId,emailExecThread)->{ try{ if(emailExecThread.getState() != State.TERMINATED && emailExecThread.isStop()){ @@ -315,7 +315,7 @@ public class AutoProcessManager{ } } } - }); + });*/ } long end = System.currentTimeMillis(); long sleepTime = taskProperties.getDeletedMailThreadExecCycle() - (end-start); diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 2f85fe4f..2b46d2bc 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -65,7 +65,7 @@ public class EmailParsingActuator extends Thread{ if (isStop) { String nowDate = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); log.info(nowDate + " " +this.emailProperties.getName()+" EmailParsingActuator is Stop!"); - closeResource(); +// closeResource(); return; } long start = System.currentTimeMillis(); @@ -110,10 +110,10 @@ public class EmailParsingActuator extends Thread{ } } catch (MessagingException e) { System.out.println("捕获MessagingException!!!!!!!!"); - closeResource(); +// closeResource(); throw new RuntimeException(e); } catch (Exception e) { - closeResource(); +// closeResource(); log.error(""+e); } finally { //清除本批次邮件日志缓存 From 11681f12dbf88c45780fdba9577e36921dcd3f7f Mon Sep 17 00:00:00 2001 From: orgin Date: Fri, 31 May 2024 09:15:57 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E4=B8=8D=E4=B8=AD=E6=96=AD=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/jeecg/modules/EmailParsingActuator.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 2b46d2bc..975626fa 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -65,8 +65,13 @@ public class EmailParsingActuator extends Thread{ if (isStop) { String nowDate = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); log.info(nowDate + " " +this.emailProperties.getName()+" EmailParsingActuator is Stop!"); + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + log.error("Thread sleep error"); + } // closeResource(); - return; + continue; } long start = System.currentTimeMillis(); final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); From 97f4aae3ab84b584d83314b8cb7422276899111b Mon Sep 17 00:00:00 2001 From: nieziyan Date: Tue, 4 Jun 2024 09:23:21 +0800 Subject: [PATCH 11/16] =?UTF-8?q?fix=EF=BC=9A=E8=87=AA=E5=8A=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/email/EmailServiceManager.java | 116 ++++++++++++++++-- .../org/jeecg/modules/AutoProcessManager.java | 23 ++-- .../jeecg/modules/EmailParsingActuator.java | 16 ++- 3 files changed, 135 insertions(+), 20 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index 257b0b26..49f02b82 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -1,16 +1,13 @@ package org.jeecg.common.email; -import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Lists; import com.sun.mail.imap.IMAPStore; import com.sun.mail.smtp.SMTPAddressFailedException; -import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.constant.RedisConstant; @@ -21,7 +18,6 @@ import org.jeecg.common.exception.DownloadEmailException; import org.jeecg.common.properties.SpectrumPathProperties; import org.jeecg.common.properties.TaskProperties; import org.jeecg.common.util.DateUtils; -import org.jeecg.common.util.Md5Util; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.base.entity.postgre.SysEmail; import org.jetbrains.annotations.NotNull; @@ -36,6 +32,9 @@ import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; /** @@ -70,6 +69,8 @@ public class EmailServiceManager { private Object downloadEmlLocal = new Object(); + private final ReentrantLock lock = new ReentrantLock(); + @NotNull public static EmailServiceManager getInstance(){ return new EmailServiceManager(); @@ -155,6 +156,8 @@ public class EmailServiceManager { store = (IMAPStore) session.getStore(); //连接 store.connect(email.getUsername(),email.getPassword()); + if (RandomUtil.randomInt(1, 5) == 3) + throw new MessagingException(); // 解决163普通邮箱无法建立连接问题 store.id(IAM); //获取收件箱 @@ -609,6 +612,105 @@ public class EmailServiceManager { } } + /*public File downloadEmailToEmlDir(@NotNull Message message, Integer emailCounter, Integer batchesCounter) throws MessagingException, IOException { + AtomicReference outputStream = new AtomicReference<>(); + CompletableFuture future = CompletableFuture.supplyAsync(() -> { + try { + lock.lock(); // 获取锁 + // 执行需要获取锁才能进行的操作 + // return executeWithLock(message, emailCounter, batchesCounter); + File file = executeWithLock(message, emailCounter, batchesCounter); + outputStream.set(new FileOutputStream(file)); + a(outputStream,message); + return null; + } catch (MessagingException e) { + throw new RuntimeException(e); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + // 如果成功拿到锁 释放锁 + lock.unlock(); + } + }); + + try { + return future.get(5, TimeUnit.SECONDS); + // return future.get(5, TimeUnit.SECONDS);// 等待任务执行,超过5秒则抛出TimeoutException + } catch (InterruptedException | ExecutionException | TimeoutException e) { + future.cancel(true); // 取消任务执行 + if (ObjectUtil.isNotNull(outputStream) && ObjectUtil.isNotNull(outputStream.get())) + outputStream.get().close(); + log.error("下载 eml 执行超时", e); + throw new RuntimeException("下载 eml 执行超时"); + } + }*/ + public File executeWithLock(Message message,Integer emailCounter,Integer batchesCounter) throws MessagingException { + + String subject = ""; + File emlFile = null; + String status = EmailLogManager.STATUS_SUCCESS; + Date receivedDate = null; + try { + // 获取锁 设置超时 + //获取发件人 + final String address = ((InternetAddress) message.getFrom()[0]).getAddress(); + final String from = address.substring(0,address.indexOf(StringConstant.AT)); + //获取主题 + subject = MimeUtility.decodeText(message.getSubject()); + if(subject.contains(StringConstant.SLASH)){ + subject = StringUtils.replace(subject,StringConstant.SLASH,""); + } + if(subject.contains(StringConstant.COLON)){ + subject = StringUtils.replace(subject,StringConstant.COLON,""); + } + receivedDate = message.getReceivedDate(); + StringBuilder fileName = new StringBuilder(); + fileName.append(from); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(subject); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(DateUtils.formatDate(new Date(),"YYMMdd")); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(DateUtils.formatDate(new Date(),"HHmmssSSS")); + fileName.append(StringConstant.UNDER_LINE); + fileName.append("receive"); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(DateUtils.formatDate(receivedDate,"YYMMdd")); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(DateUtils.formatDate(receivedDate,"HHmmssSSS")); + fileName.append(StringConstant.UNDER_LINE); + fileName.append(emailCounter); + fileName.append(SAVE_EML_SUFFIX); + final String rootPath = spectrumPathProperties.getRootPath(); + final String emlPath = spectrumPathProperties.getEmlPath(); + emlFile = new File(rootPath+emlPath+File.separator+fileName); + // Thread.sleep(6000l); + // try(FileOutputStream outputStream = new FileOutputStream(emlFile)) { + // message.writeTo(outputStream); + // } catch (IOException e) { + // throw new RuntimeException(e); + // } + } catch (MessagingException | IOException e) { + // 下载邮件失败 抛出自定义邮件下载异常 + status = EmailLogManager.STATUS_ERROR; + String errorMsg = StrUtil.format("The email download failed, the subject of the email is {}, the reason is {}.", subject, e.getMessage()); + log.error(errorMsg); + throw new DownloadEmailException(errorMsg); + } catch (Exception e) { + log.error("",e); + } finally { + EmailLogEvent event = new EmailLogEvent(batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETIDEML,subject,DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss:SSS"), + (Objects.isNull(emlFile)?" ":emlFile.getAbsolutePath())); + EmailLogManager.getInstance().offer(Thread.currentThread().getId(),event); + } + return emlFile; + } + + public void a(AtomicReference outputStream, Message message) throws MessagingException, IOException { + message.writeTo(outputStream.get()); + } /** * 删除邮件 * @param message @@ -621,7 +723,7 @@ public class EmailServiceManager { try { subject = MimeUtility.decodeText(message.getSubject()); receivedDate = message.getReceivedDate(); -// message.setFlag(Flags.Flag.DELETED,true); + // message.setFlag(Flags.Flag.DELETED,true); // log.info("EmailServiceManager: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); } catch (MessagingException | UnsupportedEncodingException e) { status = EmailLogManager.STATUS_ERROR; @@ -672,7 +774,7 @@ public class EmailServiceManager { if(numberKey >= taskProperties.getForceDeletedNumber()){ exist = true; log.info("Check: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); -// message.setFlag(Flags.Flag.DELETED,true); + // message.setFlag(Flags.Flag.DELETED,true); redisUtil.del(key); } return exist; diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index d62ad50e..19bf67d0 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -1,5 +1,6 @@ package org.jeecg.modules; +import cn.hutool.core.util.RandomUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.RedisConstant; @@ -15,7 +16,6 @@ import org.jeecg.modules.spectrum.SpectrumServiceQuotes; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.io.*; import java.util.*; import java.util.concurrent.TimeUnit; @@ -47,6 +47,8 @@ public class AutoProcessManager{ */ private Map emailExecThreadMap = new HashMap<>(); + private boolean flag = true; + /** * 启动自动处理 */ @@ -145,9 +147,14 @@ public class AutoProcessManager{ if(!email.isDelFlag()){ final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); emailServiceManager.init(email); - boolean testFlag = emailServiceManager.testConnectEmailServer(); + /*boolean testFlag = emailServiceManager.testConnectEmailServer(); if(!testFlag){ emails.add(email); + }*/ + int i = RandomUtil.randomInt(1, 5); + flag = i == 3; + if(flag){ + emails.add(email); } } }); @@ -158,7 +165,7 @@ public class AutoProcessManager{ //如果这时邮箱线程里已有执行的线程则设置停止标记 if(emailExecThreadMap.containsKey(email.getId())){ EmailParsingActuator actuator = emailExecThreadMap.get(email.getId()); - actuator.setStop(true); + actuator.setThreadSleep(true); actuator.setStopTime(new Date()); } log.info("{}邮箱测试连接失败,emailMap删除此邮箱数据,emailExecThreadMap设置线程停止标记",email.getUsername()); @@ -231,11 +238,11 @@ public class AutoProcessManager{ }else{ //如果不包含邮箱id 并且 邮箱处于启用状态 将邮箱对象存入到map中 并将新邮箱标识设置为true if(databaseEmail.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())){ - final boolean testFlag = testConnectEmailServer(databaseEmail); - if(testFlag){ + // final boolean testFlag = testConnectEmailServer(databaseEmail); + if(flag){ if (emailExecThreadMap.containsKey(databaseEmail.getId())) { EmailParsingActuator actuator = emailExecThreadMap.get(databaseEmail.getId()); - actuator.setStop(false); + actuator.setThreadSleep(false); log.info("{}邮箱重新加入监测队列",databaseEmail.getUsername()); } else { databaseEmail.setNewEmailFlag(true); @@ -290,7 +297,7 @@ public class AutoProcessManager{ } //遍历邮箱执行线程,如果邮箱执行线程stop属性已被设置为true则关闭资源停止线程 - /*final Iterator> iterator = emailExecThreadMap.entrySet().iterator(); + final Iterator> iterator = emailExecThreadMap.entrySet().iterator(); emailExecThreadMap.forEach((emailId,emailExecThread)->{ try{ if(emailExecThread.getState() != State.TERMINATED && emailExecThread.isStop()){ @@ -315,7 +322,7 @@ public class AutoProcessManager{ } } } - });*/ + }); } long end = System.currentTimeMillis(); long sleepTime = taskProperties.getDeletedMailThreadExecCycle() - (end-start); diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index 975626fa..c53a70d8 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -36,6 +36,8 @@ public class EmailParsingActuator extends Thread{ @Setter @Getter private boolean isStop; @Setter @Getter + private boolean threadSleep; + @Setter @Getter private Date stopTime; public void init(EmailProperties emailProperties,SpectrumServiceQuotes spectrumServiceQuotes, @@ -62,17 +64,21 @@ public class EmailParsingActuator extends Thread{ @Override public void run() { for(;;){ - if (isStop) { - String nowDate = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); - log.info(nowDate + " " +this.emailProperties.getName()+" EmailParsingActuator is Stop!"); + String nowDate = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); + if (threadSleep) { + log.info(nowDate + " " +this.emailProperties.getName()+" EmailParsingActuator is sleep!"); try { Thread.sleep(1000L); } catch (InterruptedException e) { log.error("Thread sleep error"); } -// closeResource(); continue; } + if (isStop) { + log.info(nowDate + " " +this.emailProperties.getName()+" EmailParsingActuator is Stop!"); + closeResource(); + return; + } long start = System.currentTimeMillis(); final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); emailServiceManager.init(this.emailProperties,this.taskProperties.getReceiveNum(),this.taskProperties.getTemporaryStoragePath(), @@ -115,7 +121,7 @@ public class EmailParsingActuator extends Thread{ } } catch (MessagingException e) { System.out.println("捕获MessagingException!!!!!!!!"); -// closeResource(); + // closeResource(); throw new RuntimeException(e); } catch (Exception e) { // closeResource(); From 3d5080c1d85713886f49484e380814cc5c46f815 Mon Sep 17 00:00:00 2001 From: nieziyan Date: Wed, 5 Jun 2024 09:42:20 +0800 Subject: [PATCH 12/16] =?UTF-8?q?fix=EF=BC=9AAutoProcess=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/common/email/EmailServiceManager.java | 11 +++++------ .../java/org/jeecg/modules/AutoProcessManager.java | 13 +++---------- .../org/jeecg/modules/EmailParsingActuator.java | 13 +++++-------- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index 49f02b82..ad7795fb 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -156,8 +156,6 @@ public class EmailServiceManager { store = (IMAPStore) session.getStore(); //连接 store.connect(email.getUsername(),email.getPassword()); - if (RandomUtil.randomInt(1, 5) == 3) - throw new MessagingException(); // 解决163普通邮箱无法建立连接问题 store.id(IAM); //获取收件箱 @@ -723,8 +721,8 @@ public class EmailServiceManager { try { subject = MimeUtility.decodeText(message.getSubject()); receivedDate = message.getReceivedDate(); - // message.setFlag(Flags.Flag.DELETED,true); -// log.info("EmailServiceManager: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); + message.setFlag(Flags.Flag.DELETED,true); + // log.info("EmailServiceManager: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); } catch (MessagingException | UnsupportedEncodingException e) { status = EmailLogManager.STATUS_ERROR; log.error("Email deletion failed, the subject of the email is :{}, the reason is :{}.",subject,e.getMessage()); @@ -750,6 +748,7 @@ public class EmailServiceManager { if(null != store){ store.close(); } + log.info("EmailServiceManage资源关闭完成."); // for(String messageId : messageIds){ // String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId; // redisUtil.del(key); @@ -770,11 +769,11 @@ public class EmailServiceManager { try { String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId; int numberKey = redisUtil.get(key) != null? (int) redisUtil.get(key):0; -// exist = redisUtil.hasKey(key); + // exist = redisUtil.hasKey(key); if(numberKey >= taskProperties.getForceDeletedNumber()){ exist = true; log.info("Check: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss")); - // message.setFlag(Flags.Flag.DELETED,true); + message.setFlag(Flags.Flag.DELETED,true); redisUtil.del(key); } return exist; diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index 19bf67d0..99912a68 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -47,8 +47,6 @@ public class AutoProcessManager{ */ private Map emailExecThreadMap = new HashMap<>(); - private boolean flag = true; - /** * 启动自动处理 */ @@ -147,14 +145,9 @@ public class AutoProcessManager{ if(!email.isDelFlag()){ final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance(); emailServiceManager.init(email); - /*boolean testFlag = emailServiceManager.testConnectEmailServer(); + boolean testFlag = emailServiceManager.testConnectEmailServer(); if(!testFlag){ emails.add(email); - }*/ - int i = RandomUtil.randomInt(1, 5); - flag = i == 3; - if(flag){ - emails.add(email); } } }); @@ -238,8 +231,8 @@ public class AutoProcessManager{ }else{ //如果不包含邮箱id 并且 邮箱处于启用状态 将邮箱对象存入到map中 并将新邮箱标识设置为true if(databaseEmail.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())){ - // final boolean testFlag = testConnectEmailServer(databaseEmail); - if(flag){ + final boolean testFlag = testConnectEmailServer(databaseEmail); + if(testFlag){ if (emailExecThreadMap.containsKey(databaseEmail.getId())) { EmailParsingActuator actuator = emailExecThreadMap.get(databaseEmail.getId()); actuator.setThreadSleep(false); diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index c53a70d8..d9ed4cd8 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -91,13 +91,11 @@ public class EmailParsingActuator extends Thread{ //检验获取的邮件是否在之前删除失败列表中,若在直接调用邮件API删除,并且此次数组里元素也删除 for(int i=messages.length-1;i>=0;i--){ if (null == messages[i].getHeader("Message-ID")) { - System.out.println("Message ID是空值信息!!!!!!!"); messages = ArrayUtils.remove(messages, i); continue; } if (!messages[i].isExpunged()){ String messageId = ((MimeMessage) messages[i]).getMessageID(); - System.out.println("正常获取到的Message ID是:"+messageId); final boolean exist = emailServiceManager.check(messages[i],messageId); messageIds.add(messageId); if(exist){ @@ -117,15 +115,14 @@ public class EmailParsingActuator extends Thread{ poolExecutor.execute(spectrumParsingActuator); } taskLatch.await(); + log.info("EmailParsingActuator本次{}封邮件处理完成", messages.length); } } - } catch (MessagingException e) { - System.out.println("捕获MessagingException!!!!!!!!"); - // closeResource(); - throw new RuntimeException(e); } catch (Exception e) { -// closeResource(); - log.error(""+e); + log.error("EmailParsingActuator has exception: {}", e.getMessage()); + log.info("Mail-Parsing线程池资源关闭..."); + closeResource(); + throw new RuntimeException(e); } finally { //清除本批次邮件日志缓存 EmailLogManager.getInstance().clear(); From 897f469ea936c5bbc0b404a9fd3cd96d23a1d884 Mon Sep 17 00:00:00 2001 From: nieziyan Date: Thu, 6 Jun 2024 15:42:06 +0800 Subject: [PATCH 13/16] =?UTF-8?q?fix=EF=BC=9A=E5=A2=9E=E5=8A=A0=E8=B0=B1?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=84=E7=90=86=E7=8A=B6=E6=80=81=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/modules/service/impl/GardsSampleDataServiceImpl.java | 3 ++- .../org/jeecg/modules/spectrum/AbstractSpectrumHandler.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/service/impl/GardsSampleDataServiceImpl.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/service/impl/GardsSampleDataServiceImpl.java index 5a2d3d6a..b5b77ac7 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/service/impl/GardsSampleDataServiceImpl.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/service/impl/GardsSampleDataServiceImpl.java @@ -84,7 +84,8 @@ public class GardsSampleDataServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(GardsSampleData::getInputFileName,inputFileName); final GardsSampleData sampleData = this.getOne(queryWrapper); - if(Objects.nonNull(sampleData) && !SampleStatus.COMPLETE.getValue().equals(sampleData.getStatus())){ + if(Objects.nonNull(sampleData) && !SampleStatus.COMPLETE.getValue().equals(sampleData.getStatus()) + && !SampleStatus.INTERACTIVE.getValue().equals(sampleData.getStatus())){ this.baseMapper.updateStatus(status,inputFileName); } } diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java index 86b4ca66..b8e6df8e 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java @@ -316,7 +316,7 @@ public abstract class AbstractSpectrumHandler extends AbstractChain { ex.printStackTrace(); } } else if(SpectrumSource.FROM_FILE_SOURCE.getSourceType().equals(spectrumSource) && (e instanceof FileRepeatException)){ - this.spectrumFile.delete(); + this.spectrumFile.delete(); // TODO 删除原始谱文件 } else if (SpectrumSource.FORM_FILE_UNDEL.getSourceType().equals(spectrumSource) && !(e instanceof FileRepeatException)) { try { if (isDateFormatErr) { From f1410028fa2f4b31b16331e349ac2733f4f66134 Mon Sep 17 00:00:00 2001 From: nieziyan Date: Thu, 6 Jun 2024 16:51:24 +0800 Subject: [PATCH 14/16] =?UTF-8?q?fix=EF=BC=9A=E4=B8=8D=E5=88=A0=E9=99=A4sa?= =?UTF-8?q?veFile=E4=B8=8B=E8=B0=B1=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/modules/spectrum/AbstractSpectrumHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java index b8e6df8e..d824459e 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/AbstractSpectrumHandler.java @@ -316,7 +316,7 @@ public abstract class AbstractSpectrumHandler extends AbstractChain { ex.printStackTrace(); } } else if(SpectrumSource.FROM_FILE_SOURCE.getSourceType().equals(spectrumSource) && (e instanceof FileRepeatException)){ - this.spectrumFile.delete(); // TODO 删除原始谱文件 + //this.spectrumFile.delete(); // TODO 删除原始谱文件 } else if (SpectrumSource.FORM_FILE_UNDEL.getSourceType().equals(spectrumSource) && !(e instanceof FileRepeatException)) { try { if (isDateFormatErr) { From 64a98bd4eae12aafd3d7f3e291b233cb0a970507 Mon Sep 17 00:00:00 2001 From: nieziyan Date: Wed, 12 Jun 2024 15:33:23 +0800 Subject: [PATCH 15/16] =?UTF-8?q?fix=EF=BC=9A=E9=82=AE=E4=BB=B6=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/jeecg/common/email/EmailServiceManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index ad7795fb..2f05814d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -135,6 +135,8 @@ public class EmailServiceManager { properties.put("mail.store.protocol", "imap"); properties.put("mail.imap.host", email.getEmailServerAddress()); properties.put("mail.imap.port",email.getPort()); + properties.put("mail.imap.connectiontimeout", "3000"); // 设置连接超时时间为3秒 + properties.put("mail.imap.timeout", "3000"); // 设置读取超时时间为3秒 if (email.getIsQiye() == 1) { properties.put("mail.imap.ssl.enable", "true"); } else { From f6b963145f884f42f8dd4ee72cc3a2b98f66963d Mon Sep 17 00:00:00 2001 From: xiaoguangbin Date: Tue, 25 Jun 2024 11:03:09 +0800 Subject: [PATCH 16/16] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0catch=E4=B8=ADexcep?= =?UTF-8?q?tion=E5=86=99=E5=85=A5log=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/common/email/EmailServiceManager.java | 12 ++++++------ .../java/org/jeecg/modules/AutoProcessManager.java | 8 +++++++- .../java/org/jeecg/modules/EmailParsingActuator.java | 5 ++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index 2f05814d..222d5ffb 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -1,8 +1,6 @@ package org.jeecg.common.email; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Lists; import com.sun.mail.imap.IMAPStore; @@ -32,7 +30,6 @@ import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.util.*; -import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @@ -127,7 +124,7 @@ public class EmailServiceManager { /** * 接收邮件 */ - public Message[] receiveMail() throws MessagingException { + public Message[] receiveMail() throws Exception { String status = EmailLogManager.STATUS_SUCCESS; try{ //配置邮件服务属性 @@ -179,6 +176,7 @@ public class EmailServiceManager { return o1.getReceivedDate().compareTo(o2.getReceivedDate()); } catch (MessagingException e) { e.printStackTrace(); + log.error(e.getMessage(), e); } return 0; }); @@ -188,7 +186,7 @@ public class EmailServiceManager { return Arrays.copyOfRange(messages,0,this.receiveNum-1); } } - } catch (MessagingException e){ + } catch (Exception e){ status = EmailLogManager.STATUS_ERROR; log.error("Email connection is abnormal, account is {}, service is {},the reason is {}.",email.getName(),email.getEmailServerAddress(),e.getMessage()); throw e; @@ -729,6 +727,7 @@ public class EmailServiceManager { status = EmailLogManager.STATUS_ERROR; log.error("Email deletion failed, the subject of the email is :{}, the reason is :{}.",subject,e.getMessage()); e.printStackTrace(); + log.error(e.getMessage(), e); }finally { EmailLogEvent removeEvent = new EmailLogEvent(batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,status,EmailLogManager.DELETEID,subject,DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss:SSS")); EmailLogManager.getInstance().offer(Thread.currentThread().getId(),removeEvent); @@ -750,7 +749,7 @@ public class EmailServiceManager { if(null != store){ store.close(); } - log.info("EmailServiceManage资源关闭完成."); + log.info(Thread.currentThread().getName() + ",EmailServiceManage资源关闭完成."); // for(String messageId : messageIds){ // String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId; // redisUtil.del(key); @@ -758,6 +757,7 @@ public class EmailServiceManager { } catch (MessagingException e) { log.error("Email closure failed, email address is: {}, reason is: {}",email.getUsername(),e.getMessage()); e.printStackTrace(); + log.error(e.getMessage(), e); } } diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java index 99912a68..2574ec35 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/AutoProcessManager.java @@ -1,6 +1,5 @@ package org.jeecg.modules; -import cn.hutool.core.util.RandomUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.RedisConstant; @@ -120,6 +119,7 @@ public class AutoProcessManager{ TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); + log.error(e.getMessage(), e); } } } @@ -169,6 +169,7 @@ public class AutoProcessManager{ //捕获异常不处理保障线程异常不退出 }catch (Exception e){ e.printStackTrace(); + log.error(e.getMessage(), e); } long end = System.currentTimeMillis(); long sleepTime = taskProperties.getMonitoringMailCommStatusCycle() - (end-start); @@ -178,6 +179,7 @@ public class AutoProcessManager{ TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); + log.error(e.getMessage(), e); } } } @@ -251,6 +253,7 @@ public class AutoProcessManager{ //捕获异常不处理保障线程异常不退出 }catch (Exception e){ e.printStackTrace(); + log.error(e.getMessage(), e); } long end = System.currentTimeMillis(); long sleepTime = taskProperties.getMonitoringMailDataCycle() - (end-start); @@ -260,6 +263,7 @@ public class AutoProcessManager{ TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); + log.error(e.getMessage(), e); } } } @@ -304,6 +308,7 @@ public class AutoProcessManager{ } }catch (Exception e){ e.printStackTrace(); + log.error(e.getMessage(), e); }finally { if(emailExecThread.getState() != State.TERMINATED && emailExecThread.isStop()){ final long nowTime = System.currentTimeMillis(); @@ -325,6 +330,7 @@ public class AutoProcessManager{ TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); + log.error(e.getMessage(), e); } } } diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java index d9ed4cd8..93ec8fa4 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/EmailParsingActuator.java @@ -86,8 +86,8 @@ public class EmailParsingActuator extends Thread{ List messageIds = new ArrayList<>(); try { Message[] messages = emailServiceManager.receiveMail(); + log.info("EmailParsingActuator本次{}获取邮件数量为:{}", Thread.currentThread().getName(), ArrayUtils.isEmpty(messages) ? 0 : messages.length); if(ArrayUtils.isNotEmpty(messages)){ - log.info("EmailParsingActuator本次{}获取邮件数量为:{}", Thread.currentThread().getName(), messages.length); //检验获取的邮件是否在之前删除失败列表中,若在直接调用邮件API删除,并且此次数组里元素也删除 for(int i=messages.length-1;i>=0;i--){ if (null == messages[i].getHeader("Message-ID")) { @@ -122,6 +122,7 @@ public class EmailParsingActuator extends Thread{ log.error("EmailParsingActuator has exception: {}", e.getMessage()); log.info("Mail-Parsing线程池资源关闭..."); closeResource(); + log.error(e.getMessage(), e); throw new RuntimeException(e); } finally { //清除本批次邮件日志缓存 @@ -142,6 +143,8 @@ public class EmailParsingActuator extends Thread{ TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); + log.error(e.getMessage(), e); + throw new RuntimeException(); } } }