Merge remote-tracking branch 'origin/mdc' into mdc

This commit is contained in:
nieziyan 2024-02-26 19:39:07 +08:00
commit cf81fab98a
15 changed files with 280 additions and 163 deletions

View File

@ -97,7 +97,7 @@ public class EmailServiceManager {
Socket socket = new Socket();
boolean flag = false;
try {
socket.connect(new InetSocketAddress(email.getEmailServerAddress(),email.getPort()),5000);
socket.connect(new InetSocketAddress(email.getEmailServerAddress(),email.getPort()),3000);
log.info("{}邮件服务连接测试成功",email.getName());
flag = true;
} catch (IOException e) {
@ -543,43 +543,45 @@ public class EmailServiceManager {
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(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(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);
// message.writeTo(new FileOutputStream(emlFile));
message.writeTo(new FileOutputStream(emlFile));
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();
// 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();
} 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()));
@ -601,6 +603,7 @@ public class EmailServiceManager {
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"));
} 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());
@ -647,6 +650,7 @@ public class EmailServiceManager {
String key = RedisConstant.EMAIL_MSG_ID+StringConstant.COLON+messageId;
exist = redisUtil.hasKey(key);
if(exist){
log.info("Check: Remove Email:{},receiveTime:{}",message.getSubject(), DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss"));
message.setFlag(Flags.Flag.DELETED,true);
}
return exist;

View File

@ -41,6 +41,16 @@ public class TaskProperties implements Serializable {
*/
private Integer mailThreadExecCycle;
/**
* 监测需删除的邮件线程执行周期毫秒
*/
private Integer deletedMailThreadExecCycle;
/**
* 强制删除邮件线程时间毫秒
*/
private Integer forceDeletedTime;
/**
* undeal目录文件获取周期
*/

View File

@ -23,8 +23,8 @@ public class AlarmAnalysisLogController extends JeecgController<AlarmAnalysisLog
}
@ApiOperation(value="报警日志分页查询", notes="报警日志分页查询")
@GetMapping(value = "findPageApp")
public Result<?> findPageApp(@ModelAttribute("analysisLogVo") AnalysisLogVo analysisLogVo) {
@PostMapping(value = "findPageApp")
public Result<?> findPageApp(@RequestBody AnalysisLogVo analysisLogVo) {
return service.findPage(analysisLogVo);
}

View File

@ -27,9 +27,9 @@ public class SysDatabaseController {
return sysDatabaseService.findPage(query);
}
@GetMapping("findPageApp")
@PostMapping("findPageApp")
@ApiOperation(value = "分页查询数据库配置信息", notes = "分页查询数据库配置信息")
public Result<?> findPageApp(@ModelAttribute("query") QueryRequest query){
public Result<?> findPageApp(@RequestBody QueryRequest query){
return sysDatabaseService.findPage(query);
}

View File

@ -27,9 +27,9 @@ public class SysEmailController {
return sysEmailService.findPage(query);
}
@GetMapping("findPageApp")
@PostMapping("findPageApp")
@ApiOperation(value = "分页查询邮箱配置信息", notes = "分页查询邮箱配置信息")
public Result findPageApp(@ModelAttribute("query") QueryRequest query){
public Result findPageApp(@RequestBody QueryRequest query){
return sysEmailService.findPage(query);
}

View File

@ -28,9 +28,9 @@ public class SysServerController {
return sysServerService.findPage(query);
}
@GetMapping("findPageApp")
@PostMapping("findPageApp")
@ApiOperation(value = "分页查询服务器数据", notes = "分页查询服务器数据")
public Result findPageApp(@ModelAttribute("query") QueryRequest query){
public Result findPageApp(@RequestBody QueryRequest query){
return sysServerService.findPage(query);
}

View File

@ -15,18 +15,18 @@ import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "armd-abnormal-alarm")
public interface AlarmClient {
@GetMapping(value = "/alarmAnalysisLog/findPageApp")
Result analysisLogFindPage(@RequestParam("analysisLogVo") AnalysisLogVo analysisLogVo);
@PostMapping(value = "/alarmAnalysisLog/findPageApp")
Result analysisLogFindPage(@RequestBody AnalysisLogVo analysisLogVo);
@PostMapping(value = "/alarmLog/findPageApp")
Result alarmLogFindPage(@RequestBody AlarmVo alarmVo);
@GetMapping(value = "/sysEmail/findPageApp")
Result emailFindPage(@RequestParam("query") QueryRequest query);
@PostMapping(value = "/sysEmail/findPageApp")
Result emailFindPage(@RequestBody QueryRequest query);
@GetMapping(value = "/sysServer/findPageApp")
Result serverFindPage(@RequestParam("query") QueryRequest query);
@PostMapping(value = "/sysServer/findPageApp")
Result serverFindPage(@RequestBody QueryRequest query);
@GetMapping(value = "/sysDatabase/findPageApp")
Result databaseFindPage(@RequestParam("query") QueryRequest query);
@PostMapping(value = "/sysDatabase/findPageApp")
Result databaseFindPage(@RequestBody QueryRequest query);
}

View File

@ -18,8 +18,8 @@ import java.util.Map;
public interface MessageService {
@GetMapping(value = "/sys/sysAnnouncementSend/getMyAnnouncementSendApp")
Result getMyAnnouncementSend(@RequestParam("announcementSendModel") AnnouncementSendModel announcementSendModel,
@PostMapping(value = "/sys/sysAnnouncementSend/getMyAnnouncementSendApp")
Result getMyAnnouncementSend(@RequestBody AnnouncementSendModel announcementSendModel,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize);

View File

@ -6,6 +6,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@ -25,8 +26,8 @@ public interface RadionuclideClient {
* @param endTime
* @return
*/
@GetMapping("/findAutoPageApp")
Result findAutoPage(@RequestParam("queryRequest") QueryRequest queryRequest,
@PostMapping("/findAutoPageApp")
Result findAutoPage(@RequestBody QueryRequest queryRequest,
@RequestParam("stationIds") Integer[] stationIds,
@RequestParam("qualifie") String qualifie,@RequestParam("sampleType") String sampleType,
@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
@ -41,8 +42,8 @@ public interface RadionuclideClient {
* @param endTime
* @return
*/
@GetMapping("/findReviewedPageApp")
Result findReviewedPage(@RequestParam("queryRequest") QueryRequest queryRequest,
@PostMapping("/findReviewedPageApp")
Result findReviewedPage(@RequestBody QueryRequest queryRequest,
@RequestParam("stationIds") Integer[] stationIds, @RequestParam("qualifie") String qualifie,
@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd")Date startTime,
@RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime);

View File

@ -15,6 +15,7 @@ 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;
@ -66,6 +67,10 @@ public class AutoProcessManager{
final MailExecManager autoProcessThread = new MailExecManager();
autoProcessThread.setName("mail-exec-thread-manage");
autoProcessThread.start();
//删除邮件执行线程管理
final DeletedMailMonitor detedMailMonitor = new DeletedMailMonitor();
detedMailMonitor.setName("deleted-mail-monitor");
detedMailMonitor.start();
}
/**
@ -78,31 +83,31 @@ public class AutoProcessManager{
for(;;){
long start = System.currentTimeMillis();
if(!CollectionUtils.isEmpty(emailMap)){
Iterator<EmailProperties> iterator = emailMap.values().iterator();
while(iterator.hasNext()){
EmailProperties next = iterator.next();
if(next.isDelFlag()){
if(emailExecThreadMap.containsKey(next.getId())){
synchronized (lock){
Iterator<EmailProperties> iterator = emailMap.values().iterator();
while(iterator.hasNext()){
EmailProperties next = iterator.next();
if (next.isResetFlag()) {
EmailParsingActuator actuator = emailExecThreadMap.get(next.getId());
actuator.setStop(true);
emailExecThreadMap.remove(next.getId());
actuator.updateEmail(next);
next.setResetFlag(false);
}
if(next.isNewEmailFlag()){
// 网络正常之后才允许创建新的实例
final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance();
emailServiceManager.init(next);
boolean testFlag = emailServiceManager.testConnectEmailServer();
if(testFlag){
EmailParsingActuator emailParsingActuator = new EmailParsingActuator();
emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime);
emailParsingActuator.setName(next.getUsername()+"-email-monitor");
emailParsingActuator.start();
//把邮件监测执行线程加入管理队列
emailExecThreadMap.put(next.getId(),emailParsingActuator);
//新邮件监测监测线程已启动则修改新邮件标记为false
next.setNewEmailFlag(false);
}
}
iterator.remove();
}
if (next.isResetFlag()) {
EmailParsingActuator actuator = emailExecThreadMap.get(next.getId());
actuator.updateEmail(next);
next.setResetFlag(false);
}
if(next.isNewEmailFlag()){
EmailParsingActuator emailParsingActuator = new EmailParsingActuator();
emailParsingActuator.init(next,spectrumServiceQuotes,emailCounter,systemStartupTime);
emailParsingActuator.setName(next.getUsername()+"-email-monitor");
emailParsingActuator.start();
//把邮件监测执行线程加入管理队列
emailExecThreadMap.put(next.getId(),emailParsingActuator);
//新邮件监测监测线程已启动则修改新邮件标记为false
next.setNewEmailFlag(false);
}
}
}
@ -133,21 +138,33 @@ public class AutoProcessManager{
long start = System.currentTimeMillis();
try{
if(!CollectionUtils.isEmpty(emailMap)){
emailMap.values().forEach(email->{
if(!email.isDelFlag()){
final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance();
emailServiceManager.init(email);
boolean testFlag = emailServiceManager.testConnectEmailServer();
// redisUtil.hset(EmailConstant.EMAIL_STATUS_PREFIX,email.getId(),testFlag);
if(testFlag && !emailExecThreadMap.containsKey(email.getId())){
email.setNewEmailFlag(true);
}
if(!testFlag){
//如果邮件服务通信测试失败则添加删除标记
email.setDelFlag(true);
synchronized (lock){
//记录连接测试失败的邮箱
List<EmailProperties> emails = new ArrayList<>();
emailMap.values().forEach(email->{
if(!email.isDelFlag()){
final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance();
emailServiceManager.init(email);
boolean testFlag = emailServiceManager.testConnectEmailServer();
if(!testFlag){
emails.add(email);
}
}
});
//如果emailIds不为空说明此次有测试连接失败的邮箱直接删除
if(!CollectionUtils.isEmpty(emails)){
emails.forEach(email->{
emailMap.remove(email.getId());
//如果这时邮箱线程里已有执行的线程则设置停止标记
if(emailExecThreadMap.containsKey(email.getId())){
EmailParsingActuator actuator = emailExecThreadMap.get(email.getId());
actuator.setStop(true);
actuator.setStopTime(new Date());
}
log.info("{}邮箱测试连接失败emailMap删除此邮箱数据emailExecThreadMap设置线程停止标记",email.getUsername());
});
}
});
}
}
//捕获异常不处理保障线程异常不退出
}catch (Exception e){
@ -182,41 +199,48 @@ public class AutoProcessManager{
try{
final List<EmailProperties> receiveMails = mailService.findReceiveMails();
if(!CollectionUtils.isEmpty(receiveMails)){
//如果库里已有数据原来已开启使用并且监测Map中已存在现在关闭使用则添加删除标记
//如果本次查询数据监测Map中不存在并且已开启使用的则加入监测Map
for(EmailProperties email : receiveMails){
//判断map里是否包含邮箱id
final boolean flag = emailMap.containsKey(email.getId());
//如果包含邮箱id 并且 邮箱处于未启用的状态 将邮箱的删除标识设置为true
if(flag && email.getEnabled().equals(SysMailEnableType.NOT_ENABLE.getMailEnableType())){
EmailProperties sourceEmail = emailMap.get(email.getId());
sourceEmail.setDelFlag(true);
}
//如果包含邮箱id 并且 邮箱处于启用状态 将邮箱数据进行更新
if (flag && email.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())) {
EmailProperties properties = emailMap.get(email.getId());
//判断邮箱的用户名密码是否与原邮箱用户名密码一致
//如果不一致则进行更新
if ( !properties.getUsername().equals(email.getUsername()) || !properties.getPassword().equals(email.getPassword()) ) {
email.setResetFlag(true);
putSysEmailMap(email);
log.info("{}邮箱加入监测队列",email.getEmailServerAddress());
final Iterator<EmailProperties> iterator = receiveMails.iterator();
synchronized (lock){
while(iterator.hasNext()){
EmailProperties databaseEmail = iterator.next();
//判断map里存储的邮箱数据是否包含当前数据库邮箱记录的id
if(emailMap.containsKey(databaseEmail.getId())){
final EmailProperties mapEmail = emailMap.get(databaseEmail.getId());
//如果数据库里邮箱数据已关闭则删除
if(databaseEmail.getEnabled().equals(SysMailEnableType.NOT_ENABLE.getMailEnableType())){
emailMap.remove(mapEmail.getId());
//如果这时邮箱线程里已有执行的线程则设置停止标记
if(emailExecThreadMap.containsKey(databaseEmail.getId())){
EmailParsingActuator actuator = emailExecThreadMap.get(databaseEmail.getId());
actuator.setStop(true);
actuator.setStopTime(new Date());
}
log.info("{}邮箱已关闭服务emailMap删除此邮箱数据emailExecThreadMap设置线程停止标记",mapEmail.getUsername());
}else{
//判断邮箱的用户名密码是否与原邮箱用户名密码一致如果不一致则进行更新
if (!mapEmail.getUsername().equals(databaseEmail.getUsername()) || !mapEmail.getPassword().equals(databaseEmail.getPassword())
|| !mapEmail.getEmailServerAddress().equals(databaseEmail.getEmailServerAddress())) {
final boolean testFlag = testConnectEmailServer(databaseEmail);
if(testFlag){
databaseEmail.setResetFlag(true);
emailMap.put(databaseEmail.getId(),databaseEmail);
log.info("{}邮箱数据已更新,覆盖原邮箱数据,设置重置标记",mapEmail.getUsername());
}
}
}
}else{
//如果不包含邮箱id 并且 邮箱处于启用状态 将邮箱对象存入到map中 并将新邮箱标识设置为true
if(databaseEmail.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())){
final boolean testFlag = testConnectEmailServer(databaseEmail);
if(testFlag){
databaseEmail.setNewEmailFlag(true);
emailMap.put(databaseEmail.getId(),databaseEmail);
log.info("{}邮箱加入监测队列,设置新增标记",databaseEmail.getUsername());
}
}
}
}
//如果不包含邮箱id 并且 邮箱处于启用状态 将邮箱对象存入到map中 并将新邮箱标识设置为true
if(!flag && email.getEnabled().equals(SysMailEnableType.ENABLE.getMailEnableType())){
email.setNewEmailFlag(true);
putSysEmailMap(email);
log.info("{}邮箱加入监测队列",email.getEmailServerAddress());
}
}
//如果监测Map中存在的邮箱数据在本次查询数据中不存在说明库里已删除则添加删除标记
emailMap.forEach((emailId,sourceEmail)->{
final long result = receiveMails.stream().filter(email -> emailId.equals(email.getId())).count();
if (result <= 0){
sourceEmail.setDelFlag(true);
}
});
}
//捕获异常不处理保障线程异常不退出
}catch (Exception e){
@ -237,38 +261,78 @@ public class AutoProcessManager{
}
/**
* 新增邮箱数据
* @param email
* 监测已设置删除标记的邮箱线程
* isStop值为true的邮箱线程
* 20秒还未停止则进行强制停止
*/
private void putSysEmailMap(EmailProperties email){
synchronized (this.lock){
emailMap.put(email.getId(),email);
}
}
private class DeletedMailMonitor extends Thread{
/**
* 删除邮箱数据
* @param emailId
*/
private void removeSysEmailMap(String emailId){
synchronized (this.lock){
if (emailMap.containsKey(emailId)){
emailMap.remove(emailId);
}
}
}
@Override
public void run() {
for(;;){
long start = System.currentTimeMillis();
if(!CollectionUtils.isEmpty(emailExecThreadMap)){
//遍历邮箱执行线程如果状态为已停止则删除
final Iterator<Map.Entry<String, EmailParsingActuator>> checkStopThreads = emailExecThreadMap.entrySet().iterator();
while (checkStopThreads.hasNext()){
final Map.Entry<String, EmailParsingActuator> next = checkStopThreads.next();
if(next.getValue().getState() == State.TERMINATED){
log.info("{}邮箱执行线程已停止emailExecThreadMap删除此邮箱数据",next.getValue().getEmailProperties().getUsername());
checkStopThreads.remove();
}
}
/**
* 删除邮箱数据
* @param sysEmailIds
*/
private void removeSysEmailMap(List<String> sysEmailIds){
synchronized (this.lock){
for(String sysEmailId : sysEmailIds){
if (emailMap.containsKey(sysEmailId)){
emailMap.remove(sysEmailId);
//遍历邮箱执行线程如果邮箱执行线程stop属性已被设置为true则关闭资源停止线程
final Iterator<Map.Entry<String, EmailParsingActuator>> iterator = emailExecThreadMap.entrySet().iterator();
emailExecThreadMap.forEach((emailId,emailExecThread)->{
try{
if(emailExecThread.getState() != State.TERMINATED && emailExecThread.isStop()){
final long nowTime = System.currentTimeMillis();
final long setStoptime = emailExecThread.getStopTime().getTime();
final long val = nowTime - setStoptime;
if(val >= taskProperties.getForceDeletedTime()){
log.info("关闭{}邮箱线程内部线程池资源",emailExecThread.getEmailProperties().getUsername());
emailExecThread.closeResource();
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(emailExecThread.getState() != State.TERMINATED && emailExecThread.isStop()){
final long nowTime = System.currentTimeMillis();
final long setStoptime = emailExecThread.getStopTime().getTime();
final long val = nowTime - setStoptime;
if(val >= taskProperties.getForceDeletedTime()){
log.info("强制停止{}邮箱线程",emailExecThread.getEmailProperties().getUsername());
emailExecThread.stop();
}
}
}
});
}
long end = System.currentTimeMillis();
long sleepTime = taskProperties.getDeletedMailThreadExecCycle() - (end-start);
//如果sleepTime > 0 需要睡眠到指定时间否则继续下次监测
if(sleepTime > 0){
try {
TimeUnit.MILLISECONDS.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 测试邮箱连通性
* @param email
* @return
*/
private boolean testConnectEmailServer(EmailProperties email){
final EmailServiceManager emailServiceManager = EmailServiceManager.getInstance();
emailServiceManager.init(email);
boolean testFlag = emailServiceManager.testConnectEmailServer();
return testFlag;
}
}

View File

@ -1,5 +1,6 @@
package org.jeecg.modules;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
@ -19,6 +20,7 @@ import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.*;
/**
@ -28,13 +30,16 @@ import java.util.concurrent.*;
public class EmailParsingActuator extends Thread{
private TaskProperties taskProperties;
@Getter
private EmailProperties emailProperties;
private ThreadPoolExecutor poolExecutor;
private SpectrumServiceQuotes spectrumServiceQuotes;
private EmailCounter emailCounter;
private Date systemStartupTime;
@Setter
@Setter @Getter
private boolean isStop;
@Setter @Getter
private Date stopTime;
public void init(EmailProperties emailProperties,SpectrumServiceQuotes spectrumServiceQuotes,
EmailCounter emailCounter,Date systemStartupTime){
@ -63,6 +68,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();
return;
}
long start = System.currentTimeMillis();
@ -75,16 +81,16 @@ public class EmailParsingActuator extends Thread{
if(ArrayUtils.isNotEmpty(messages)){
log.info("EmailParsingActuator本次获取邮件数量为{}",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);
messageIds.add(messageId);
if(exist){
messages = ArrayUtils.remove(messages,i);
}
}
}
// 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);
// messageIds.add(messageId);
// if(exist){
// messages = ArrayUtils.remove(messages,i);
// }
// }
// }
log.info("EmailParsingActuator本次真实执行邮件数量为{}",messages.length);
if(messages.length > 0){
//本批次邮件号
@ -99,7 +105,7 @@ public class EmailParsingActuator extends Thread{
taskLatch.await();
}
}
}catch (InterruptedException | MessagingException e) {
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
//清除本批次邮件日志缓存
@ -124,4 +130,13 @@ public class EmailParsingActuator extends Thread{
}
}
}
/**
* 立即关闭线程池
*/
protected void closeResource(){
if(Objects.nonNull(poolExecutor)) {
poolExecutor.shutdownNow();
}
}
}

View File

@ -2,6 +2,8 @@ package org.jeecg.modules.spectrum;
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.lang3.StringUtils;
import org.jeecg.common.constant.RedisConstant;
@ -16,8 +18,10 @@ import org.jeecg.modules.enums.SpectrumSource;
import org.jeecg.modules.file.FileOperation;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
@ -80,13 +84,16 @@ public class SpectrumParsingActuator implements Runnable{
@Override
public void run() {
String subject = null;
boolean downloadFlag = false;
String receiveDate = null;
try {
//获取邮件主题
subject = emailServiceManager.getMailSubject(message,this.batchesCounter);
//解析之前先把邮件唯一信息存储到redis
String messageId = ((MimeMessage) message).getMessageID();
String emlName = subject+ StringConstant.UNDER_LINE+ DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss");
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;
spectrumServiceQuotes.getRedisUtil().set(key,emlName,expiryTime);
//线程开始初始化时初始本线程负责的能谱日志事件
@ -94,6 +101,8 @@ public class SpectrumParsingActuator implements Runnable{
//所有邮件都需以.eml格式存储到eml文件夹中
final File emlFile = emailServiceManager.downloadEmailToEmlDir(message, emailCounter.getCurrValue(),this.batchesCounter);
downloadFlag = true;
//保存邮件日志到PG数据库
this.spectrumServiceQuotes.getMailLogService().create(message,emailProperties);
@ -123,15 +132,29 @@ public class SpectrumParsingActuator implements Runnable{
final String emlErrorPath = spectrumServiceQuotes.getSpectrumPathProperties().getEmlErrorPath();
final String finalPath = rootPath+emlErrorPath;
FileOperation.moveFile(emlFile,finalPath,true);
// 删除 key防止下次线程执行删除邮件
spectrumServiceQuotes.getRedisUtil().del(key);
throw new DownloadEmailException("邮件移走后手动抛出DownloadEmailException");
}
}
} catch (Exception e) {
// 如果不是下载导致的失败则删除下载的邮件对象
if(!(e instanceof DownloadEmailException)){
try {
if (StrUtil.isBlank(subject)) {
subject = message.getSubject();
}
if (StrUtil.isBlank(receiveDate)) {
receiveDate = DateUtils.formatDate(message.getReceivedDate(),"yyyy-MM-dd HH:mm:ss");
}
} catch (MessagingException ex) {
log.error("SpectrumParsingActuator中获取Message信息出现异常", ex);
}
// 如果不是下载导致的失败 并且 下载成功则删除下载的邮件对象
if(!(e instanceof DownloadEmailException) && downloadFlag){
log.error("Remove Email"+ subject + StringPool.UNDERSCORE + receiveDate + StringPool.UNDERSCORE);
emailServiceManager.removeMail(message,batchesCounter);
}
e.printStackTrace();
//输出异常信息
log.error("邮件处理异常{},邮件主题:{}", e, subject);
}finally {
try {
EmailLogEvent expungeEvent = new EmailLogEvent(this.batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,EmailLogManager.DONE);

View File

@ -225,8 +225,8 @@ public class SysAnnouncementSendController {
* @功能获取我的消息
* @return
*/
@GetMapping(value = "/getMyAnnouncementSendApp")
public Result getMyAnnouncementSendApp(@ModelAttribute("announcementSendModel") AnnouncementSendModel announcementSendModel,
@PostMapping(value = "/getMyAnnouncementSendApp")
public Result getMyAnnouncementSendApp(@RequestBody AnnouncementSendModel announcementSendModel,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
Result result = new Result();

View File

@ -37,9 +37,9 @@ public class RadionuclideController {
return reviewedService.findReviewedPage(queryRequest, stationIds, qualifie,startTime, endTime);
}
@GetMapping("findAutoPageApp")
@PostMapping("findAutoPageApp")
@ApiOperation(value = "分页查询自动处理结果", notes = "分页查询自动处理结果")
public Result findAutoPageApp(@ModelAttribute("queryRequest") QueryRequest queryRequest,
public Result findAutoPageApp(@RequestBody QueryRequest queryRequest,
@RequestParam("stationIds") Integer[] stationIds,
@RequestParam("qualifie") String qualifie, @RequestParam("sampleType") String sampleType,
@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd")Date startTime,
@ -47,9 +47,9 @@ public class RadionuclideController {
return autoService.findAutoPage(queryRequest, stationIds, qualifie, sampleType,startTime, endTime);
}
@GetMapping("findReviewedPageApp")
@PostMapping("findReviewedPageApp")
@ApiOperation(value = "分页查询人工交互结果", notes = "分页查询人工交互结果")
public Result findReviewedPageApp(@ModelAttribute("queryRequest") QueryRequest queryRequest,
public Result findReviewedPageApp(@RequestBody QueryRequest queryRequest,
@RequestParam("stationIds") Integer[] stationIds,@RequestParam("qualifie") String qualifie,
@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd")Date startTime,
@RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime){

View File

@ -70,11 +70,11 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im
public void run(String... args) throws Exception {
//调用dll
//Windows加载dll工具库
// System.loadLibrary("ReadPHDFile");
// System.loadLibrary("GammaAnaly");
System.loadLibrary("ReadPHDFile");
System.loadLibrary("GammaAnaly");
//Linux版本加载dll工具库
System.load("/usr/local/jdk/lib/libReadPHDFile.so");
System.load("/usr/local/jdk/lib/libGammaAnalyALG.so");
// System.load("/usr/local/jdk/lib/libReadPHDFile.so");
// System.load("/usr/local/jdk/lib/libGammaAnalyALG.so");
nuclLibService.getNuclideMap();
//根据配置文件配置邮件获取策略定义时间条件默认EmailReceivePolicy.HISTORY_ORDER_RECEIVE.getPolicy()
Date systemStartupTime = null;