ligang
6 years ago
15 changed files with 1751 additions and 0 deletions
@ -0,0 +1,146 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" |
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<parent> |
||||||
|
<groupId>cn.analysys</groupId> |
||||||
|
<artifactId>escheduler</artifactId> |
||||||
|
<version>1.0.0</version> |
||||||
|
</parent> |
||||||
|
<artifactId>escheduler-alert</artifactId> |
||||||
|
<packaging>jar</packaging> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
</properties> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>junit</groupId> |
||||||
|
<artifactId>junit</artifactId> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-email</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>javax.mail</groupId> |
||||||
|
<artifactId>mail</artifactId> |
||||||
|
<exclusions> |
||||||
|
<exclusion> |
||||||
|
<groupId>javax.servlet</groupId> |
||||||
|
<artifactId>javax.servlet-api</artifactId> |
||||||
|
</exclusion> |
||||||
|
</exclusions> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.freemarker</groupId> |
||||||
|
<artifactId>freemarker</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>com.alibaba</groupId> |
||||||
|
<artifactId>fastjson</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>com.fasterxml.jackson.core</groupId> |
||||||
|
<artifactId>jackson-core</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>com.fasterxml.jackson.core</groupId> |
||||||
|
<artifactId>jackson-databind</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.slf4j</groupId> |
||||||
|
<artifactId>slf4j-api</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-collections4</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>commons-logging</groupId> |
||||||
|
<artifactId>commons-logging</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-lang3</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>com.google.guava</groupId> |
||||||
|
<artifactId>guava</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>ch.qos.logback</groupId> |
||||||
|
<artifactId>logback-classic</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>commons-io</groupId> |
||||||
|
<artifactId>commons-io</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-collections4</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!--excel poi--> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.poi</groupId> |
||||||
|
<artifactId>poi</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>cn.analysys</groupId> |
||||||
|
<artifactId>escheduler-dao</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
</dependencies> |
||||||
|
|
||||||
|
<build> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-assembly-plugin</artifactId> |
||||||
|
<version>2.6</version> |
||||||
|
<configuration> |
||||||
|
<descriptors> |
||||||
|
<descriptor>src/main/assembly/package.xml</descriptor> |
||||||
|
</descriptors> |
||||||
|
<appendAssemblyId>false</appendAssemblyId> |
||||||
|
</configuration> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>make-assembly</id> |
||||||
|
<phase>package</phase> |
||||||
|
<goals> |
||||||
|
<goal>single</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-compiler-plugin</artifactId> |
||||||
|
<configuration> |
||||||
|
<source>${java.version}</source> |
||||||
|
<target>${java.version}</target> |
||||||
|
<encoding>${project.build.sourceEncoding}</encoding> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</build> |
||||||
|
|
||||||
|
</project> |
@ -0,0 +1,40 @@ |
|||||||
|
<assembly |
||||||
|
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> |
||||||
|
<id>cluster</id> |
||||||
|
<formats> |
||||||
|
<format>dir</format> |
||||||
|
</formats> |
||||||
|
<includeBaseDirectory>false</includeBaseDirectory> |
||||||
|
<fileSets> |
||||||
|
<fileSet> |
||||||
|
<directory>src/main/resources</directory> |
||||||
|
<includes> |
||||||
|
<include>**/*.properties</include> |
||||||
|
<include>**/*.xml</include> |
||||||
|
<include>**/*.json</include> |
||||||
|
<include>**/*.ftl</include> |
||||||
|
</includes> |
||||||
|
<outputDirectory>conf</outputDirectory> |
||||||
|
</fileSet> |
||||||
|
<fileSet> |
||||||
|
<directory>target/</directory> |
||||||
|
<includes> |
||||||
|
<include>escheduler-alert-${project.version}.jar</include> |
||||||
|
</includes> |
||||||
|
<outputDirectory>lib</outputDirectory> |
||||||
|
</fileSet> |
||||||
|
</fileSets> |
||||||
|
<dependencySets> |
||||||
|
<dependencySet> |
||||||
|
<outputDirectory>lib</outputDirectory> |
||||||
|
<useProjectArtifact>true</useProjectArtifact> |
||||||
|
<excludes> |
||||||
|
<exclude>javax.servlet:servlet-api</exclude> |
||||||
|
<exclude>org.eclipse.jetty.aggregate:jetty-all</exclude> |
||||||
|
<exclude>org.slf4j:slf4j-log4j12</exclude> |
||||||
|
</excludes> |
||||||
|
</dependencySet> |
||||||
|
</dependencySets> |
||||||
|
</assembly> |
@ -0,0 +1,79 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert; |
||||||
|
|
||||||
|
import cn.escheduler.alert.runner.AlertSender; |
||||||
|
import cn.escheduler.alert.utils.Constants; |
||||||
|
import cn.escheduler.common.thread.Stopper; |
||||||
|
import cn.escheduler.dao.AlertDao; |
||||||
|
import cn.escheduler.dao.DaoFactory; |
||||||
|
import cn.escheduler.dao.model.Alert; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* alert of start |
||||||
|
*/ |
||||||
|
public class AlertServer { |
||||||
|
private static final Logger logger = LoggerFactory.getLogger(AlertServer.class); |
||||||
|
/** |
||||||
|
* Alert Dao |
||||||
|
*/ |
||||||
|
private AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); |
||||||
|
|
||||||
|
private AlertSender alertSender; |
||||||
|
|
||||||
|
private static AlertServer instance; |
||||||
|
|
||||||
|
private AlertServer() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static AlertServer getInstance(){ |
||||||
|
if (null == instance) { |
||||||
|
synchronized (AlertServer.class) { |
||||||
|
if(null == instance) { |
||||||
|
instance = new AlertServer(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return instance; |
||||||
|
} |
||||||
|
|
||||||
|
public void start(){ |
||||||
|
logger.info("Alert Server ready start!"); |
||||||
|
while (Stopper.isRunning()){ |
||||||
|
try { |
||||||
|
Thread.sleep(Constants.ALERT_SCAN_INTERVEL); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} |
||||||
|
List<Alert> alerts = alertDao.listWaitExecutionAlert(); |
||||||
|
alertSender = new AlertSender(alerts, alertDao); |
||||||
|
alertSender.run(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args){ |
||||||
|
|
||||||
|
AlertServer alertServer = AlertServer.getInstance(); |
||||||
|
alertServer.start(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.manager; |
||||||
|
|
||||||
|
import cn.escheduler.alert.utils.MailUtils; |
||||||
|
import cn.escheduler.common.enums.ShowType; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* email send manager |
||||||
|
*/ |
||||||
|
public class EmailManager { |
||||||
|
/** |
||||||
|
* email send |
||||||
|
* @param receviersList |
||||||
|
* @param receviersCcList |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @param showType |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public Map<String,Object> send(List<String> receviersList,List<String> receviersCcList,String title,String content,ShowType showType){ |
||||||
|
|
||||||
|
return MailUtils.sendMails(receviersList,receviersCcList,title, content, showType); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* msg send |
||||||
|
* @param receviersList |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @param showType |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public Map<String,Object> send(List<String> receviersList,String title,String content,ShowType showType){ |
||||||
|
|
||||||
|
return MailUtils.sendMails(receviersList,title, content, showType); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.manager; |
||||||
|
|
||||||
|
import cn.escheduler.dao.model.Alert; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* SMS send manager |
||||||
|
*/ |
||||||
|
public class MsgManager { |
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(MsgManager.class); |
||||||
|
/** |
||||||
|
* SMS send |
||||||
|
* @param alert |
||||||
|
*/ |
||||||
|
public void send(Alert alert){ |
||||||
|
logger.info("send message {}",alert); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,133 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.runner; |
||||||
|
|
||||||
|
import cn.escheduler.alert.manager.EmailManager; |
||||||
|
import cn.escheduler.alert.utils.Constants; |
||||||
|
import cn.escheduler.common.enums.AlertStatus; |
||||||
|
import cn.escheduler.common.enums.AlertType; |
||||||
|
import cn.escheduler.dao.AlertDao; |
||||||
|
import cn.escheduler.dao.model.Alert; |
||||||
|
import cn.escheduler.dao.model.User; |
||||||
|
import org.apache.commons.collections4.CollectionUtils; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* alert sender |
||||||
|
*/ |
||||||
|
public class AlertSender{ |
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(AlertSender.class); |
||||||
|
|
||||||
|
private static final EmailManager emailManager= new EmailManager(); |
||||||
|
|
||||||
|
|
||||||
|
private List<Alert> alertList; |
||||||
|
private AlertDao alertDao; |
||||||
|
|
||||||
|
public AlertSender(){} |
||||||
|
public AlertSender(List<Alert> alertList, AlertDao alertDao){ |
||||||
|
super(); |
||||||
|
this.alertList = alertList; |
||||||
|
this.alertDao = alertDao; |
||||||
|
} |
||||||
|
|
||||||
|
public void run() { |
||||||
|
|
||||||
|
List<User> users; |
||||||
|
|
||||||
|
Map<String, Object> retMaps = null; |
||||||
|
for(Alert alert:alertList){ |
||||||
|
users = alertDao.listUserByAlertgroupId(alert.getAlertGroupId()); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// receiving group list
|
||||||
|
List<String> receviersList = new ArrayList<String>(); |
||||||
|
for(User user:users){ |
||||||
|
receviersList.add(user.getEmail()); |
||||||
|
} |
||||||
|
// custom receiver
|
||||||
|
String receivers = alert.getReceivers(); |
||||||
|
if (StringUtils.isNotEmpty(receivers)){ |
||||||
|
String[] splits = receivers.split(","); |
||||||
|
for (String receiver : splits){ |
||||||
|
receviersList.add(receiver); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// copy list
|
||||||
|
List<String> receviersCcList = new ArrayList<String>(); |
||||||
|
|
||||||
|
|
||||||
|
// Custom Copier
|
||||||
|
String receiversCc = alert.getReceiversCc(); |
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(receiversCc)){ |
||||||
|
String[] splits = receiversCc.split(","); |
||||||
|
for (String receiverCc : splits){ |
||||||
|
receviersCcList.add(receiverCc); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(receviersList) && CollectionUtils.isEmpty(receviersCcList)) { |
||||||
|
logger.warn("alert send error : At least one receiver address required"); |
||||||
|
alertDao.updateAlert(AlertStatus.EXECUTION_FAILURE, "execution failure,At least one receiver address required.", alert.getId()); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (alert.getAlertType() == AlertType.EMAIL){ |
||||||
|
retMaps = emailManager.send(receviersList,receviersCcList, alert.getTitle(), alert.getContent(),alert.getShowType()); |
||||||
|
|
||||||
|
alert.setInfo(retMaps); |
||||||
|
}else if (alert.getAlertType() == AlertType.SMS){ |
||||||
|
retMaps = emailManager.send(getReciversForSMS(users), alert.getTitle(), alert.getContent(),alert.getShowType()); |
||||||
|
alert.setInfo(retMaps); |
||||||
|
} |
||||||
|
|
||||||
|
boolean flag = Boolean.parseBoolean(String.valueOf(retMaps.get(Constants.STATUS))); |
||||||
|
if (flag){ |
||||||
|
alertDao.updateAlert(AlertStatus.EXECUTION_SUCCESS, "execution success", alert.getId()); |
||||||
|
logger.info("alert send success"); |
||||||
|
}else { |
||||||
|
alertDao.updateAlert(AlertStatus.EXECUTION_FAILURE,String.valueOf(retMaps.get(Constants.MESSAGE)),alert.getId()); |
||||||
|
logger.info("alert send error : {}" , String.valueOf(retMaps.get(Constants.MESSAGE))); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* get a list of SMS users |
||||||
|
* @param users |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private List<String> getReciversForSMS(List<User> users){ |
||||||
|
List<String> list = new ArrayList<>(); |
||||||
|
for (User user : users){ |
||||||
|
list.add(user.getPhone()); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,127 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* constants |
||||||
|
*/ |
||||||
|
public class Constants { |
||||||
|
|
||||||
|
/** |
||||||
|
* alert properties path |
||||||
|
*/ |
||||||
|
public static final String ALERT_PROPERTIES_PATH = "/alert.properties"; |
||||||
|
|
||||||
|
public static final String DATA_SOURCE_PROPERTIES_PATH = "/dao/data_source.properties"; |
||||||
|
|
||||||
|
public static final String SINGLE_SLASH = "/"; |
||||||
|
|
||||||
|
/** |
||||||
|
* UTF-8 |
||||||
|
*/ |
||||||
|
public static final String UTF_8 = "UTF-8"; |
||||||
|
|
||||||
|
public static final String STATUS = "status"; |
||||||
|
|
||||||
|
public static final String MESSAGE = "message"; |
||||||
|
|
||||||
|
public static final String MAIL_PROTOCOL = "mail.protocol"; |
||||||
|
|
||||||
|
public static final String MAIL_SERVER_HOST = "mail.server.host"; |
||||||
|
|
||||||
|
public static final String MAIL_SERVER_PORT = "mail.server.port"; |
||||||
|
|
||||||
|
public static final String MAIL_SENDER = "mail.sender"; |
||||||
|
|
||||||
|
public static final String MAIL_PASSWD = "mail.passwd"; |
||||||
|
|
||||||
|
public static final String XLS_FILE_PATH = "xls.file.path"; |
||||||
|
|
||||||
|
public static final String MAIL_HOST = "mail.host"; |
||||||
|
|
||||||
|
public static final String MAIL_SMTP_AUTH = "mail.smtp.auth"; |
||||||
|
|
||||||
|
public static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol"; |
||||||
|
|
||||||
|
public static final String TEXT_HTML_CHARSET_UTF_8 = "text/html;charset=utf-8"; |
||||||
|
|
||||||
|
public static final String STRING_TRUE = "true"; |
||||||
|
|
||||||
|
public static final String EXCEL_SUFFIX_XLS = ".xls"; |
||||||
|
|
||||||
|
public static final int NUMBER_1000 = 1000; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_DRIVER_CLASS_NAME = "spring.datasource.driver-class-name"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_URL = "spring.datasource.url"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_USERNAME = "spring.datasource.username"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_PASSWORD = "spring.datasource.password"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_VALIDATION_QUERY_TIMEOUT = "spring.datasource.validationQueryTimeout"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_INITIAL_SIZE = "spring.datasource.initialSize"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_MIN_IDLE = "spring.datasource.minIdle"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_MAX_ACTIVE = "spring.datasource.maxActive"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_MAX_WAIT = "spring.datasource.maxWait"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_TIME_BETWEEN_EVICTION_RUNS_MILLIS = "spring.datasource.timeBetweenEvictionRunsMillis"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_MIN_EVICTABLE_IDLE_TIME_MILLIS = "spring.datasource.minEvictableIdleTimeMillis"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_VALIDATION_QUERY = "spring.datasource.validationQuery"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_TEST_WHILE_IDLE = "spring.datasource.testWhileIdle"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_TEST_ON_BORROW = "spring.datasource.testOnBorrow"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_TEST_ON_RETURN = "spring.datasource.testOnReturn"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_POOL_PREPARED_STATEMENTS = "spring.datasource.poolPreparedStatements"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_DEFAULT_AUTO_COMMIT = "spring.datasource.defaultAutoCommit"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_KEEP_ALIVE = "spring.datasource.keepAlive"; |
||||||
|
|
||||||
|
public static final String SPRING_DATASOURCE_MAX_POOL_PREPARED_STATEMENT_PER_CONNECTION_SIZE = "spring.datasource.maxPoolPreparedStatementPerConnectionSize"; |
||||||
|
|
||||||
|
public static final String DEVELOPMENT = "development"; |
||||||
|
|
||||||
|
public static final String CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL = "classpath:mail_templates/alert_mail_template.ftl"; |
||||||
|
|
||||||
|
public static final String TR = "<tr>"; |
||||||
|
|
||||||
|
public static final String TD = "<td>"; |
||||||
|
|
||||||
|
public static final String TD_END = "</td>"; |
||||||
|
|
||||||
|
public static final String TR_END = "</tr>"; |
||||||
|
|
||||||
|
public static final String TITLE = "title"; |
||||||
|
|
||||||
|
public static final String CONTENT = "content"; |
||||||
|
|
||||||
|
public static final String TH = "<th>"; |
||||||
|
|
||||||
|
public static final String TH_END = "</th>"; |
||||||
|
|
||||||
|
public static final int ALERT_SCAN_INTERVEL = 5000; |
||||||
|
} |
@ -0,0 +1,131 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFCell; |
||||||
|
import org.apache.poi.hssf.usermodel.HSSFRow; |
||||||
|
import org.apache.poi.hssf.usermodel.HSSFSheet; |
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* excel utils |
||||||
|
*/ |
||||||
|
public class ExcelUtils { |
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class); |
||||||
|
/** |
||||||
|
* generate excel file |
||||||
|
* @param content |
||||||
|
* @param title |
||||||
|
* @param xlsFilePath |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static void genExcelFile(String content,String title,String xlsFilePath){ |
||||||
|
List<LinkedHashMap> itemsList; |
||||||
|
try { |
||||||
|
itemsList = JSONUtils.toList(content, LinkedHashMap.class); |
||||||
|
}catch (Exception e){ |
||||||
|
logger.error(String.format("json format incorrect : %s",content),e); |
||||||
|
throw new RuntimeException("json format incorrect",e); |
||||||
|
} |
||||||
|
|
||||||
|
if (itemsList == null || itemsList.size() == 0){ |
||||||
|
logger.error("itemsList is null"); |
||||||
|
throw new RuntimeException("itemsList is null"); |
||||||
|
} |
||||||
|
|
||||||
|
LinkedHashMap<String, Object> headerMap = itemsList.get(0); |
||||||
|
|
||||||
|
List<String> headerList = new ArrayList<>(); |
||||||
|
|
||||||
|
Iterator<Map.Entry<String, Object>> iter = headerMap.entrySet().iterator(); |
||||||
|
while (iter.hasNext()){ |
||||||
|
Map.Entry<String, Object> en = iter.next(); |
||||||
|
headerList.add(en.getKey()); |
||||||
|
} |
||||||
|
|
||||||
|
HSSFWorkbook wb = null; |
||||||
|
FileOutputStream fos = null; |
||||||
|
try { |
||||||
|
// declare a workbook
|
||||||
|
wb = new HSSFWorkbook(); |
||||||
|
// generate a table
|
||||||
|
HSSFSheet sheet = wb.createSheet(); |
||||||
|
HSSFRow row = sheet.createRow(0); |
||||||
|
//set the height of the first line
|
||||||
|
row.setHeight((short)500); |
||||||
|
|
||||||
|
|
||||||
|
//setting excel headers
|
||||||
|
for (int i = 0; i < headerList.size(); i++) { |
||||||
|
HSSFCell cell = row.createCell(i); |
||||||
|
cell.setCellValue(headerList.get(i)); |
||||||
|
} |
||||||
|
|
||||||
|
//setting excel body
|
||||||
|
int rowIndex = 1; |
||||||
|
for (LinkedHashMap<String, Object> itemsMap : itemsList){ |
||||||
|
Object[] values = itemsMap.values().toArray(); |
||||||
|
row = sheet.createRow(rowIndex); |
||||||
|
//setting excel body height
|
||||||
|
row.setHeight((short)500); |
||||||
|
rowIndex++; |
||||||
|
for (int j = 0 ; j < values.length ; j++){ |
||||||
|
HSSFCell cell1 = row.createCell(j); |
||||||
|
cell1.setCellValue(String.valueOf(values[j])); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0; i < headerList.size(); i++) { |
||||||
|
sheet.setColumnWidth(i, headerList.get(i).length() * 800); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
//setting file output
|
||||||
|
fos = new FileOutputStream(xlsFilePath + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS); |
||||||
|
|
||||||
|
wb.write(fos); |
||||||
|
|
||||||
|
}catch (Exception e){ |
||||||
|
logger.error("generate excel error",e); |
||||||
|
throw new RuntimeException("generate excel error",e); |
||||||
|
}finally { |
||||||
|
if (wb != null){ |
||||||
|
try { |
||||||
|
wb.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} |
||||||
|
} |
||||||
|
if (fos != null){ |
||||||
|
try { |
||||||
|
fos.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* json utils |
||||||
|
*/ |
||||||
|
public class JSONUtils { |
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(JSONUtils.class); |
||||||
|
|
||||||
|
/** |
||||||
|
* object to json string |
||||||
|
* @param object |
||||||
|
* @return json string |
||||||
|
*/ |
||||||
|
public static String toJsonString(Object object) { |
||||||
|
try{ |
||||||
|
return JSONObject.toJSONString(object,false); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new RuntimeException("Json deserialization exception.", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* json to list |
||||||
|
* |
||||||
|
* @param json |
||||||
|
* @param clazz c |
||||||
|
* @param <T> |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static <T> List<T> toList(String json, Class<T> clazz) { |
||||||
|
if (StringUtils.isEmpty(json)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
try { |
||||||
|
return JSONArray.parseArray(json, clazz); |
||||||
|
} catch (Exception e) { |
||||||
|
logger.error("JSONArray.parseArray exception!",e); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,429 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
import cn.escheduler.common.enums.ShowType; |
||||||
|
import freemarker.cache.StringTemplateLoader; |
||||||
|
import freemarker.template.Configuration; |
||||||
|
import freemarker.template.Template; |
||||||
|
import freemarker.template.TemplateException; |
||||||
|
import org.apache.commons.collections4.CollectionUtils; |
||||||
|
import org.apache.commons.io.IOUtils; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.apache.commons.mail.EmailException; |
||||||
|
import org.apache.commons.mail.HtmlEmail; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.util.ResourceUtils; |
||||||
|
|
||||||
|
import javax.mail.*; |
||||||
|
import javax.mail.internet.*; |
||||||
|
import java.io.*; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
import static cn.escheduler.alert.utils.PropertyUtils.getInt; |
||||||
|
import static cn.escheduler.alert.utils.PropertyUtils.getString; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* mail utils |
||||||
|
*/ |
||||||
|
public class MailUtils { |
||||||
|
|
||||||
|
public static final Logger logger = LoggerFactory.getLogger(MailUtils.class); |
||||||
|
|
||||||
|
public static final String mailProtocol = getString(Constants.MAIL_PROTOCOL); |
||||||
|
|
||||||
|
public static final String mailServerHost = getString(Constants.MAIL_SERVER_HOST); |
||||||
|
|
||||||
|
public static final Integer mailServerPort = getInt(Constants.MAIL_SERVER_PORT); |
||||||
|
|
||||||
|
public static final String mailSender = getString(Constants.MAIL_SENDER); |
||||||
|
|
||||||
|
public static final String mailPasswd = getString(Constants.MAIL_PASSWD); |
||||||
|
|
||||||
|
public static final String xlsFilePath = getString(Constants.XLS_FILE_PATH); |
||||||
|
|
||||||
|
private static Template MAIL_TEMPLATE; |
||||||
|
|
||||||
|
static { |
||||||
|
Configuration cfg = new Configuration(Configuration.VERSION_2_3_21); |
||||||
|
cfg.setDefaultEncoding(Constants.UTF_8); |
||||||
|
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); |
||||||
|
cfg.setTemplateLoader(stringTemplateLoader); |
||||||
|
InputStreamReader isr = null; |
||||||
|
try { |
||||||
|
isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile(Constants.CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL)), |
||||||
|
Constants.UTF_8); |
||||||
|
|
||||||
|
MAIL_TEMPLATE = new Template("alert_mail_template", isr, cfg); |
||||||
|
} catch (Exception e) { |
||||||
|
MAIL_TEMPLATE = null; |
||||||
|
} finally { |
||||||
|
IOUtils.closeQuietly(isr); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* send mail to receivers |
||||||
|
* |
||||||
|
* @param receivers |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Map<String,Object> sendMails(Collection<String> receivers, String title, String content,ShowType showType) { |
||||||
|
return sendMails(receivers, null, title, content, showType); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* send mail |
||||||
|
* @param receivers |
||||||
|
* @param receiversCc cc |
||||||
|
* @param title title |
||||||
|
* @param content content |
||||||
|
* @param showType mail type |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Map<String,Object> sendMails(Collection<String> receivers, Collection<String> receiversCc, String title, String content, ShowType showType) { |
||||||
|
Map<String,Object> retMap = new HashMap<>(); |
||||||
|
retMap.put(Constants.STATUS, false); |
||||||
|
|
||||||
|
|
||||||
|
receivers.removeIf((from) -> (StringUtils.isEmpty(from))); |
||||||
|
|
||||||
|
if (showType == ShowType.TABLE || showType == ShowType.TEXT){ |
||||||
|
// send email
|
||||||
|
HtmlEmail email = new HtmlEmail(); |
||||||
|
|
||||||
|
try { |
||||||
|
// set the SMTP sending server, 163 as follows: "smtp.163.com"
|
||||||
|
email.setHostName(mailServerHost); |
||||||
|
email.setSmtpPort(mailServerPort); |
||||||
|
//set charset
|
||||||
|
email.setCharset(Constants.UTF_8); |
||||||
|
if (CollectionUtils.isNotEmpty(receivers)){ |
||||||
|
// receivers mail
|
||||||
|
for (String receiver : receivers) { |
||||||
|
email.addTo(receiver); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(receiversCc)){ |
||||||
|
//cc
|
||||||
|
for (String receiverCc : receiversCc) { |
||||||
|
email.addCc(receiverCc); |
||||||
|
} |
||||||
|
} |
||||||
|
// sender mail
|
||||||
|
return getStringObjectMap(title, content, showType, retMap, email); |
||||||
|
} catch (Exception e) { |
||||||
|
handleException(receivers, retMap, e); |
||||||
|
} |
||||||
|
}else if (showType == ShowType.ATTACHMENT || showType == ShowType.TABLEATTACHMENT){ |
||||||
|
try { |
||||||
|
|
||||||
|
String partContent = (showType == ShowType.ATTACHMENT ? "Please see the attachment " + title + Constants.EXCEL_SUFFIX_XLS : htmlTable(content,false)); |
||||||
|
|
||||||
|
attachment(receivers,receiversCc,title,content,partContent); |
||||||
|
|
||||||
|
retMap.put(Constants.STATUS, true); |
||||||
|
return retMap; |
||||||
|
}catch (Exception e){ |
||||||
|
handleException(receivers, retMap, e); |
||||||
|
} |
||||||
|
} |
||||||
|
return retMap; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* html table content |
||||||
|
* @param content |
||||||
|
* @param showAll |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static String htmlTable(String content, boolean showAll){ |
||||||
|
if (StringUtils.isNotEmpty(content)){ |
||||||
|
List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class); |
||||||
|
|
||||||
|
if(!showAll && mapItemsList.size() > Constants.NUMBER_1000){ |
||||||
|
mapItemsList = mapItemsList.subList(0,Constants.NUMBER_1000); |
||||||
|
} |
||||||
|
|
||||||
|
StringBuilder contents = new StringBuilder(200); |
||||||
|
|
||||||
|
boolean flag = true; |
||||||
|
|
||||||
|
String title = ""; |
||||||
|
for (LinkedHashMap mapItems : mapItemsList){ |
||||||
|
|
||||||
|
Set<Map.Entry<String, String>> entries = mapItems.entrySet(); |
||||||
|
|
||||||
|
Iterator<Map.Entry<String, String>> iterator = entries.iterator(); |
||||||
|
|
||||||
|
StringBuilder t = new StringBuilder(Constants.TR); |
||||||
|
StringBuilder cs = new StringBuilder(Constants.TR); |
||||||
|
while (iterator.hasNext()){ |
||||||
|
|
||||||
|
Map.Entry<String, String> entry = iterator.next(); |
||||||
|
t.append(Constants.TH).append(entry.getKey()).append(Constants.TH_END); |
||||||
|
cs.append(Constants.TD).append(String.valueOf(entry.getValue())).append(Constants.TD_END); |
||||||
|
|
||||||
|
} |
||||||
|
t.append(Constants.TR_END); |
||||||
|
cs.append(Constants.TR_END); |
||||||
|
if (flag){ |
||||||
|
title = t.toString(); |
||||||
|
} |
||||||
|
flag = false; |
||||||
|
contents.append(cs); |
||||||
|
} |
||||||
|
|
||||||
|
return getTemplateContent(title,contents.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* html table content |
||||||
|
* @param content |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static String htmlTable(String content){ |
||||||
|
return htmlTable(content,true); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* html text content |
||||||
|
* @param content |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static String htmlText(String content){ |
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(content)){ |
||||||
|
List<String> list; |
||||||
|
try { |
||||||
|
list = JSONUtils.toList(content,String.class); |
||||||
|
}catch (Exception e){ |
||||||
|
logger.error("json format exception",e); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
StringBuilder contents = new StringBuilder(100); |
||||||
|
for (String str : list){ |
||||||
|
contents.append(Constants.TR); |
||||||
|
contents.append(Constants.TD).append(str).append(Constants.TD_END); |
||||||
|
contents.append(Constants.TR_END); |
||||||
|
} |
||||||
|
|
||||||
|
return getTemplateContent(null,contents.toString()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* send mail as Excel attachment |
||||||
|
* |
||||||
|
* @param receivers |
||||||
|
* @param title |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private static void attachment(Collection<String> receivers,Collection<String> receiversCc,String title,String content,String partContent)throws Exception{ |
||||||
|
MimeMessage msg = getMimeMessage(receivers); |
||||||
|
|
||||||
|
attachContent(receiversCc, title, content,partContent, msg); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get MimeMessage |
||||||
|
* @param receivers |
||||||
|
* @return |
||||||
|
* @throws MessagingException |
||||||
|
*/ |
||||||
|
private static MimeMessage getMimeMessage(Collection<String> receivers) throws MessagingException { |
||||||
|
Properties props = new Properties(); |
||||||
|
props.setProperty(Constants.MAIL_HOST, mailServerHost); |
||||||
|
props.setProperty(Constants.MAIL_SMTP_AUTH, Constants.STRING_TRUE); |
||||||
|
props.setProperty(Constants.MAIL_TRANSPORT_PROTOCOL, mailProtocol); |
||||||
|
Authenticator auth = new Authenticator() { |
||||||
|
@Override |
||||||
|
protected PasswordAuthentication getPasswordAuthentication() { |
||||||
|
// mail username and password
|
||||||
|
return new PasswordAuthentication(mailSender, mailPasswd); |
||||||
|
} |
||||||
|
}; |
||||||
|
// 1. The first step in creating mail: creating session
|
||||||
|
Session session = Session.getInstance(props, auth); |
||||||
|
// Setting debug mode, can be turned off
|
||||||
|
session.setDebug(false); |
||||||
|
// 2. creating mail: Creating a MimeMessage
|
||||||
|
MimeMessage msg = new MimeMessage(session); |
||||||
|
// 3. set sender
|
||||||
|
msg.setFrom(new InternetAddress(mailSender)); |
||||||
|
// 4. set receivers
|
||||||
|
for (String receiver : receivers) { |
||||||
|
msg.addRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(receiver)); |
||||||
|
} |
||||||
|
return msg; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param receiversCc |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @param partContent |
||||||
|
* @param msg |
||||||
|
* @throws MessagingException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
private static void attachContent(Collection<String> receiversCc, String title, String content, String partContent,MimeMessage msg) throws MessagingException, IOException { |
||||||
|
/** |
||||||
|
* set receiverCc |
||||||
|
*/ |
||||||
|
if(CollectionUtils.isNotEmpty(receiversCc)){ |
||||||
|
for (String receiverCc : receiversCc){ |
||||||
|
msg.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(receiverCc)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// set receivers type to cc
|
||||||
|
// msg.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(propMap.get("${CC}")));
|
||||||
|
// set subject
|
||||||
|
msg.setSubject(title); |
||||||
|
MimeMultipart partList = new MimeMultipart(); |
||||||
|
// set signature
|
||||||
|
MimeBodyPart part1 = new MimeBodyPart(); |
||||||
|
part1.setContent(partContent, Constants.TEXT_HTML_CHARSET_UTF_8); |
||||||
|
// set attach file
|
||||||
|
MimeBodyPart part2 = new MimeBodyPart(); |
||||||
|
// make excel file
|
||||||
|
ExcelUtils.genExcelFile(content,title,xlsFilePath); |
||||||
|
File file = new File(xlsFilePath + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS); |
||||||
|
part2.attachFile(file); |
||||||
|
part2.setFileName(MimeUtility.encodeText(title + Constants.EXCEL_SUFFIX_XLS)); |
||||||
|
// add components to collection
|
||||||
|
partList.addBodyPart(part1); |
||||||
|
partList.addBodyPart(part2); |
||||||
|
msg.setContent(partList); |
||||||
|
// 5. send Transport
|
||||||
|
Transport.send(msg); |
||||||
|
// 6. delete saved file
|
||||||
|
deleteFile(file); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @param showType |
||||||
|
* @param retMap |
||||||
|
* @param email |
||||||
|
* @return |
||||||
|
* @throws EmailException |
||||||
|
*/ |
||||||
|
private static Map<String, Object> getStringObjectMap(String title, String content, ShowType showType, Map<String, Object> retMap, HtmlEmail email) throws EmailException { |
||||||
|
// sender's mailbox
|
||||||
|
email.setFrom(mailSender, mailSender); |
||||||
|
/** |
||||||
|
* if you need authentication information, set authentication: username-password. |
||||||
|
* The registered name and password of the sender on the mail server respectively |
||||||
|
*/ |
||||||
|
email.setAuthentication(mailSender, mailPasswd); |
||||||
|
|
||||||
|
/** |
||||||
|
* the subject of the message to be sent |
||||||
|
*/ |
||||||
|
email.setSubject(title); |
||||||
|
/** |
||||||
|
* to send information, you can use HTML tags in mail content because of the use of HtmlEmail |
||||||
|
*/ |
||||||
|
if (showType == ShowType.TABLE) { |
||||||
|
email.setMsg(htmlTable(content)); |
||||||
|
} else if (showType == ShowType.TEXT) { |
||||||
|
email.setMsg(htmlText(content)); |
||||||
|
} |
||||||
|
|
||||||
|
// send
|
||||||
|
email.send(); |
||||||
|
|
||||||
|
retMap.put(Constants.STATUS, true); |
||||||
|
|
||||||
|
return retMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* file delete |
||||||
|
* @param file |
||||||
|
*/ |
||||||
|
public static void deleteFile(File file){ |
||||||
|
if(file.exists()){ |
||||||
|
if(file.delete()){ |
||||||
|
logger.info("delete success:"+file.getAbsolutePath()+file.getName()); |
||||||
|
}else{ |
||||||
|
logger.info("delete fail"+file.getAbsolutePath()+file.getName()); |
||||||
|
} |
||||||
|
}else{ |
||||||
|
logger.info("file not exists:"+file.getAbsolutePath()+file.getName()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param receivers |
||||||
|
* @param retMap |
||||||
|
* @param e |
||||||
|
*/ |
||||||
|
private static void handleException(Collection<String> receivers, Map<String, Object> retMap, Exception e) { |
||||||
|
logger.error("Send email to {} failed", StringUtils.join(",", receivers), e); |
||||||
|
retMap.put(Constants.MESSAGE, "Send email to {" + StringUtils.join(",", receivers) + "} failed," + e.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param title |
||||||
|
* @param content |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static String getTemplateContent(String title,String content){ |
||||||
|
StringWriter out = new StringWriter(); |
||||||
|
Map<String,String> map = new HashMap<>(); |
||||||
|
if(null != title){ |
||||||
|
map.put(Constants.TITLE,title); |
||||||
|
} |
||||||
|
map.put(Constants.CONTENT,content); |
||||||
|
try { |
||||||
|
MAIL_TEMPLATE.process(map, out); |
||||||
|
return out.toString(); |
||||||
|
} catch (TemplateException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} catch (IOException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,193 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.util.Properties; |
||||||
|
|
||||||
|
import static cn.escheduler.alert.utils.Constants.ALERT_PROPERTIES_PATH; |
||||||
|
import static cn.escheduler.alert.utils.Constants.DATA_SOURCE_PROPERTIES_PATH; |
||||||
|
|
||||||
|
/** |
||||||
|
* property utils |
||||||
|
* single instance |
||||||
|
*/ |
||||||
|
public class PropertyUtils { |
||||||
|
|
||||||
|
/** |
||||||
|
* logger |
||||||
|
*/ |
||||||
|
private static final Logger logger = LoggerFactory.getLogger(PropertyUtils.class); |
||||||
|
|
||||||
|
private static final Properties properties = new Properties(); |
||||||
|
|
||||||
|
private static final PropertyUtils propertyUtils = new PropertyUtils(); |
||||||
|
|
||||||
|
private PropertyUtils(){ |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
private void init(){ |
||||||
|
String[] propertyFiles = new String[]{ALERT_PROPERTIES_PATH,DATA_SOURCE_PROPERTIES_PATH}; |
||||||
|
for (String fileName : propertyFiles) { |
||||||
|
InputStream fis = null; |
||||||
|
try { |
||||||
|
fis = PropertyUtils.class.getResourceAsStream(fileName); |
||||||
|
properties.load(fis); |
||||||
|
|
||||||
|
} catch (IOException e) { |
||||||
|
logger.error(e.getMessage(), e); |
||||||
|
System.exit(1); |
||||||
|
} finally { |
||||||
|
IOUtils.closeQuietly(fis); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
public static PropertyUtils getInstance(){ |
||||||
|
return propertyUtils; |
||||||
|
} |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* get property value |
||||||
|
* |
||||||
|
* @param key property name |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getString(String key) { |
||||||
|
return properties.getProperty(key); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get property value |
||||||
|
* |
||||||
|
* @param key property name |
||||||
|
* @return get property int value , if key == null, then return -1 |
||||||
|
*/ |
||||||
|
public static int getInt(String key) { |
||||||
|
return getInt(key, -1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param key |
||||||
|
* @param defaultValue |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static int getInt(String key, int defaultValue) { |
||||||
|
String value = getString(key); |
||||||
|
if (value == null) { |
||||||
|
return defaultValue; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
return Integer.parseInt(value); |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
logger.info(e.getMessage(),e); |
||||||
|
} |
||||||
|
return defaultValue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get property value |
||||||
|
* |
||||||
|
* @param key property name |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Boolean getBoolean(String key) { |
||||||
|
String value = properties.getProperty(key.trim()); |
||||||
|
if(null != value){ |
||||||
|
return Boolean.parseBoolean(value); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param key |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static long getLong(String key) { |
||||||
|
return getLong(key,-1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param key |
||||||
|
* @param defaultVal |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static long getLong(String key, long defaultVal) { |
||||||
|
String val = getString(key); |
||||||
|
return val == null ? defaultVal : Long.parseLong(val); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param key |
||||||
|
* @param defaultVal |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public double getDouble(String key, double defaultVal) { |
||||||
|
String val = getString(key); |
||||||
|
return val == null ? defaultVal : Double.parseDouble(val); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* get array |
||||||
|
* @param key property name |
||||||
|
* @param splitStr separator |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String[] getArray(String key, String splitStr) { |
||||||
|
String value = getString(key); |
||||||
|
if (value == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
try { |
||||||
|
String[] propertyArray = value.split(splitStr); |
||||||
|
return propertyArray; |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
logger.info(e.getMessage(),e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param key |
||||||
|
* @param type |
||||||
|
* @param defaultValue |
||||||
|
* @param <T> |
||||||
|
* @return get enum value |
||||||
|
*/ |
||||||
|
public <T extends Enum<T>> T getEnum(String key, Class<T> type, |
||||||
|
T defaultValue) { |
||||||
|
String val = getString(key); |
||||||
|
return val == null ? defaultValue : Enum.valueOf(type, val); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
#alert type is EMAIL/SMS |
||||||
|
alert.type=EMAIL |
||||||
|
|
||||||
|
# mail server configuration |
||||||
|
mail.protocol=SMTP |
||||||
|
mail.server.host=smtp.exmail.qq.com |
||||||
|
mail.server.port=25 |
||||||
|
mail.sender=xxxxxxx |
||||||
|
mail.passwd=xxxxxxx |
||||||
|
|
||||||
|
#xls file path,need create if not exist |
||||||
|
xls.file.path=/opt/xls |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,31 @@ |
|||||||
|
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html --> |
||||||
|
<configuration scan="true" scanPeriod="120 seconds"> <!--debug="true" --> |
||||||
|
<property name="log.base" value="logs" /> |
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
||||||
|
<encoder> |
||||||
|
<pattern> |
||||||
|
[%level] %date{yyyy-MM-dd HH:mm:ss.SSS} %logger{96}:[%line] - %msg%n |
||||||
|
</pattern> |
||||||
|
<charset>UTF-8</charset> |
||||||
|
</encoder> |
||||||
|
</appender> |
||||||
|
|
||||||
|
<appender name="ALERTLOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||||
|
<file>${log.base}/escheduler-alert.log</file> |
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> |
||||||
|
<fileNamePattern>${log.base}/escheduler-alert.%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern> |
||||||
|
<maxHistory>20</maxHistory> |
||||||
|
<maxFileSize>64MB</maxFileSize> |
||||||
|
</rollingPolicy> |
||||||
|
<encoder> |
||||||
|
<pattern> |
||||||
|
[%level] %date{yyyy-MM-dd HH:mm:ss.SSS} %logger{96}:[%line] - %msg%n |
||||||
|
</pattern> |
||||||
|
<charset>UTF-8</charset> |
||||||
|
</encoder> |
||||||
|
</appender> |
||||||
|
|
||||||
|
<root level="INFO"> |
||||||
|
<appender-ref ref="ALERTLOGFILE"/> |
||||||
|
</root> |
||||||
|
</configuration> |
@ -0,0 +1,38 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'> |
||||||
|
<html> |
||||||
|
<head><title> easyscheduler </title> |
||||||
|
<meta name='Keywords' content=''> |
||||||
|
<meta name='Description' content=''> |
||||||
|
<style type="text/css">table { |
||||||
|
font-size: 14px; |
||||||
|
color: #333333; |
||||||
|
border-width: 1px; |
||||||
|
border-color: #666666; |
||||||
|
border-collapse: collapse; |
||||||
|
} |
||||||
|
|
||||||
|
table th { |
||||||
|
border-width: 1px; |
||||||
|
padding: 8px; |
||||||
|
border-style: solid; |
||||||
|
border-color: #666666; |
||||||
|
background-color: #dedede; |
||||||
|
} |
||||||
|
|
||||||
|
table td { |
||||||
|
border-width: 1px; |
||||||
|
padding: 8px; |
||||||
|
border-style: solid; |
||||||
|
border-color: #666666; |
||||||
|
background-color: #ffffff; |
||||||
|
}</style> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<table> |
||||||
|
<thead> |
||||||
|
<#if title??> ${title} </#if> |
||||||
|
</thead> |
||||||
|
<#if content??> ${content} </#if> |
||||||
|
</table> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,229 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package cn.escheduler.alert.utils; |
||||||
|
|
||||||
|
|
||||||
|
import cn.escheduler.common.enums.AlertType; |
||||||
|
import cn.escheduler.common.enums.ShowType; |
||||||
|
import cn.escheduler.dao.AlertDao; |
||||||
|
import cn.escheduler.dao.DaoFactory; |
||||||
|
import cn.escheduler.dao.model.Alert; |
||||||
|
import cn.escheduler.dao.model.User; |
||||||
|
import freemarker.cache.StringTemplateLoader; |
||||||
|
import freemarker.template.Configuration; |
||||||
|
import freemarker.template.Template; |
||||||
|
import freemarker.template.TemplateException; |
||||||
|
import org.apache.commons.io.IOUtils; |
||||||
|
import org.junit.Test; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.util.ResourceUtils; |
||||||
|
|
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.io.StringWriter; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
*/ |
||||||
|
public class MailUtilsTest { |
||||||
|
private static final Logger logger = LoggerFactory.getLogger(MailUtilsTest.class); |
||||||
|
@Test |
||||||
|
public void testSendMails() { |
||||||
|
String[] receivers = new String[]{"xx@xx.com"}; |
||||||
|
String[] receiversCc = new String[]{"xxx@xxx.com"}; |
||||||
|
|
||||||
|
String content ="[\"id:69\"," + |
||||||
|
"\"name:UserBehavior-0--1193959466\"," + |
||||||
|
"\"Job name: 启动工作流\"," + |
||||||
|
"\"State: SUCCESS\"," + |
||||||
|
"\"Recovery:NO\"," + |
||||||
|
"\"Run time: 1\"," + |
||||||
|
"\"Start time: 2018-08-06 10:31:34.0\"," + |
||||||
|
"\"End time: 2018-08-06 10:31:49.0\"," + |
||||||
|
"\"Host: 192.168.xx.xx\"," + |
||||||
|
"\"Notify group :4\"]"; |
||||||
|
|
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql异常"); |
||||||
|
alert.setShowType(ShowType.TEXT); |
||||||
|
alert.setContent(content); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(4); |
||||||
|
|
||||||
|
MailUtils.sendMails(Arrays.asList(receivers),Arrays.asList(receiversCc),alert.getTitle(),alert.getContent(), ShowType.TEXT); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void testQuery(){ |
||||||
|
AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); |
||||||
|
List<Alert> alerts = alertDao.listWaitExecutionAlert(); |
||||||
|
|
||||||
|
String[] mails = new String[]{"xx@xx.com"}; |
||||||
|
|
||||||
|
for(Alert alert : alerts){ |
||||||
|
MailUtils.sendMails(Arrays.asList(mails),"gaojing", alert.getContent(), alert.getShowType()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public String list2String(){ |
||||||
|
|
||||||
|
LinkedHashMap<String, Object> map1 = new LinkedHashMap<>(); |
||||||
|
map1.put("mysql服务名称","mysql200"); |
||||||
|
map1.put("mysql地址","192.168.xx.xx"); |
||||||
|
map1.put("端口","3306"); |
||||||
|
map1.put("期间内没有使用索引的查询数握","80"); |
||||||
|
map1.put("数据库客户端连接数","190"); |
||||||
|
|
||||||
|
LinkedHashMap<String, Object> map2 = new LinkedHashMap<>(); |
||||||
|
map2.put("mysql服务名称","mysql210"); |
||||||
|
map2.put("mysql地址","192.168.xx.xx"); |
||||||
|
map2.put("端口","3306"); |
||||||
|
map2.put("期间内没有使用索引的查询数握","10"); |
||||||
|
map2.put("数据库客户端连接数","90"); |
||||||
|
|
||||||
|
List<LinkedHashMap<String, Object>> maps = new ArrayList<>(); |
||||||
|
maps.add(0,map1); |
||||||
|
maps.add(1,map2); |
||||||
|
String mapjson = JSONUtils.toJsonString(maps); |
||||||
|
logger.info(mapjson); |
||||||
|
|
||||||
|
return mapjson; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testSendTableMail(){ |
||||||
|
String[] mails = new String[]{"xx@xx.com"}; |
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql Exception"); |
||||||
|
alert.setShowType(ShowType.TABLE); |
||||||
|
String content= list2String(); |
||||||
|
alert.setContent(content); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(1); |
||||||
|
MailUtils.sendMails(Arrays.asList(mails),"gaojing", alert.getContent(), ShowType.TABLE); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Used to test add alarm information, mail sent |
||||||
|
* Text |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void addAlertText(){ |
||||||
|
AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); |
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql Exception"); |
||||||
|
alert.setShowType(ShowType.TEXT); |
||||||
|
alert.setContent("[\"告警时间:2018-02-05\", \"服务名:MYSQL_ALTER\", \"告警名:MYSQL_ALTER_DUMP\", \"获取告警异常!,接口报错,异常信息:timed out\", \"请求地址:http://blog.csdn.net/dreamInTheWorld/article/details/78539286\"]"); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(1); |
||||||
|
alertDao.addAlert(alert); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Used to test add alarm information, mail sent |
||||||
|
* Table |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void addAlertTable(){ |
||||||
|
AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); |
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql Exception"); |
||||||
|
alert.setShowType(ShowType.TABLE); |
||||||
|
|
||||||
|
String content = list2String(); |
||||||
|
alert.setContent(content); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(1); |
||||||
|
alertDao.addAlert(alert); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testAlertDao(){ |
||||||
|
AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); |
||||||
|
List<User> users = alertDao.listUserByAlertgroupId(3); |
||||||
|
logger.info(users.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testAttachmentFile()throws Exception{ |
||||||
|
String[] mails = new String[]{"xx@xx.com"}; |
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql Exception"); |
||||||
|
alert.setShowType(ShowType.ATTACHMENT); |
||||||
|
String content = list2String(); |
||||||
|
alert.setContent(content); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(1); |
||||||
|
MailUtils.sendMails(Arrays.asList(mails),"gaojing",alert.getContent(),ShowType.ATTACHMENT); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testTableAttachmentFile()throws Exception{ |
||||||
|
String[] mails = new String[]{"xx@xx.com"}; |
||||||
|
Alert alert = new Alert(); |
||||||
|
alert.setTitle("Mysql Exception"); |
||||||
|
alert.setShowType(ShowType.TABLEATTACHMENT); |
||||||
|
String content = list2String(); |
||||||
|
alert.setContent(content); |
||||||
|
alert.setAlertType(AlertType.EMAIL); |
||||||
|
alert.setAlertGroupId(1); |
||||||
|
MailUtils.sendMails(Arrays.asList(mails),"gaojing",alert.getContent(),ShowType.TABLEATTACHMENT); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void template(){ |
||||||
|
Template MAIL_TEMPLATE; |
||||||
|
Configuration cfg = new Configuration(Configuration.VERSION_2_3_21); |
||||||
|
cfg.setDefaultEncoding(Constants.UTF_8); |
||||||
|
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); |
||||||
|
cfg.setTemplateLoader(stringTemplateLoader); |
||||||
|
InputStreamReader isr = null; |
||||||
|
try { |
||||||
|
isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile(Constants.CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL)), |
||||||
|
Constants.UTF_8); |
||||||
|
|
||||||
|
MAIL_TEMPLATE = new Template("alert_mail_template", isr, cfg); |
||||||
|
} catch (Exception e) { |
||||||
|
MAIL_TEMPLATE = null; |
||||||
|
} finally { |
||||||
|
IOUtils.closeQuietly(isr); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
StringWriter out = new StringWriter(); |
||||||
|
Map<String,String> map = new HashMap<>(); |
||||||
|
map.put(Constants.TITLE,"title_test"); |
||||||
|
try { |
||||||
|
MAIL_TEMPLATE.process(map, out); |
||||||
|
logger.info(out.toString()); |
||||||
|
|
||||||
|
} catch (TemplateException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} catch (IOException e) { |
||||||
|
logger.error(e.getMessage(),e); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue