ソースを参照

告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;

xuxueli 8 年 前
コミット
2f2ed56348

+ 1 - 0
doc/XXL-JOB官方文档.md ファイルの表示

@@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1079 1079
 - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
1080 1080
 - 15、Log地址格式兼容,支持非"/"结尾路径配置;
1081 1081
 - 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
1082
+- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
1082 1083
 
1083 1084
 
1084 1085
 ### TODO LIST

+ 1 - 0
pom.xml ファイルの表示

@@ -34,6 +34,7 @@
34 34
 		<commons-exec.version>1.3</commons-exec.version>
35 35
 		<commons-beanutils.version>1.9.2</commons-beanutils.version>
36 36
 		<commons-lang.version>2.6</commons-lang.version>
37
+		<commons-email.version>1.5</commons-email.version>
37 38
 
38 39
 		<c3p0.version>0.9.5.2</c3p0.version>
39 40
 		<mysql-connector-java.version>5.1.29</mysql-connector-java.version>

+ 4 - 4
xxl-job-admin/pom.xml ファイルの表示

@@ -124,11 +124,11 @@
124 124
 			<version>${httpclient.version}</version>
125 125
 		</dependency>
126 126
 
127
-		<!-- javax.mail -->
127
+		<!-- commons-email -->
128 128
 		<dependency>
129
-			<groupId>javax.mail</groupId>
130
-			<artifactId>mail</artifactId>
131
-			<version>${mail.version}</version>
129
+			<groupId>org.apache.commons</groupId>
130
+			<artifactId>commons-email</artifactId>
131
+			<version>${commons-email.version}</version>
132 132
 		</dependency>
133 133
 
134 134
 		<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->

+ 48 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java ファイルの表示

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.model.XxlJobLog;
6 6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
+import com.xxl.job.admin.core.util.JobKeyUtil;
7 8
 import com.xxl.job.admin.core.util.MailUtil;
8 9
 import com.xxl.job.core.biz.model.ReturnT;
9 10
 import com.xxl.job.core.handler.IJobHandler;
@@ -28,6 +29,8 @@ public class JobFailMonitorHelper {
28 29
 		return instance;
29 30
 	}
30 31
 
32
+	// ---------------------- monitor ----------------------
33
+
31 34
 	private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
32 35
 
33 36
 	private Thread monitorThread;
@@ -97,6 +100,46 @@ public class JobFailMonitorHelper {
97 100
 		monitorThread.start();
98 101
 	}
99 102
 
103
+	public void toStop(){
104
+		toStop = true;
105
+		// interrupt and wait
106
+		monitorThread.interrupt();
107
+		try {
108
+			monitorThread.join();
109
+		} catch (InterruptedException e) {
110
+			logger.error(e.getMessage(), e);
111
+		}
112
+	}
113
+	
114
+	// producer
115
+	public static void monitor(int jobLogId){
116
+		getInstance().queue.offer(jobLogId);
117
+	}
118
+
119
+
120
+	// ---------------------- alarm ----------------------
121
+
122
+	// email alarm template
123
+	private static final String mailBodyTemplate = "<h5>监控告警明细:</span>" +
124
+			"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
125
+			"   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
126
+			"      <tr>\n" +
127
+			"         <td>执行器</td>\n" +
128
+			"         <td>JobKey</td>\n" +
129
+			"         <td>任务描述</td>\n" +
130
+			"         <td>告警类型</td>\n" +
131
+			"      </tr>\n" +
132
+			"   <thead/>\n" +
133
+			"   <tbody>\n" +
134
+			"      <tr>\n" +
135
+			"         <td>{0}</td>\n" +
136
+			"         <td>{1}</td>\n" +
137
+			"         <td>{2}</td>\n" +
138
+			"         <td>调度失败</td>\n" +
139
+			"      </tr>\n" +
140
+			"   <tbody>\n" +
141
+			"</table>";
142
+
100 143
 	/**
101 144
 	 * fail alarm
102 145
 	 *
@@ -110,10 +153,12 @@ public class JobFailMonitorHelper {
110 153
 
111 154
 			Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
112 155
 			for (String email: emailSet) {
113
-				String title = "《调度监控报警》(任务调度中心XXL-JOB)";
114 156
 				XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
115
-				String content = MessageFormat.format("任务调度失败, 执行器名称:{0}, 任务描述:{1}.", group!=null?group.getTitle():"null", info.getJobDesc());
116
-				MailUtil.sendMail(email, title, content, false, null);
157
+
158
+				String title = "调度中心监控报警";
159
+				String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", JobKeyUtil.formatJobKey(info), info.getJobDesc());
160
+
161
+				MailUtil.sendMail(email, title, content);
117 162
 			}
118 163
 		}
119 164
 
@@ -121,20 +166,4 @@ public class JobFailMonitorHelper {
121 166
 
122 167
 	}
123 168
 
124
-	public void toStop(){
125
-		toStop = true;
126
-		// interrupt and wait
127
-		monitorThread.interrupt();
128
-		try {
129
-			monitorThread.join();
130
-		} catch (InterruptedException e) {
131
-			logger.error(e.getMessage(), e);
132
-		}
133
-	}
134
-	
135
-	// producer
136
-	public static void monitor(int jobLogId){
137
-		getInstance().queue.offer(jobLogId);
138
-	}
139
-	
140 169
 }

+ 23 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java ファイルの表示

@@ -0,0 +1,23 @@
1
+package com.xxl.job.admin.core.util;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobInfo;
4
+
5
+/**
6
+ * job key util
7
+ *
8
+ * @author xuxueli 2017-12-22 18:48:45
9
+ */
10
+public class JobKeyUtil {
11
+
12
+    /**
13
+     * format job key
14
+     *
15
+     * @param xxlJobInfo
16
+     * @return
17
+     */
18
+    public static String formatJobKey(XxlJobInfo xxlJobInfo){
19
+        return String.valueOf(xxlJobInfo.getJobGroup())
20
+                .concat("_").concat(String.valueOf(xxlJobInfo.getId()));
21
+    }
22
+
23
+}

+ 34 - 84
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java ファイルの表示

@@ -1,19 +1,16 @@
1 1
 package com.xxl.job.admin.core.util;
2 2
 
3
-import org.apache.commons.lang.ArrayUtils;
3
+import org.apache.commons.mail.DefaultAuthenticator;
4
+import org.apache.commons.mail.EmailException;
5
+import org.apache.commons.mail.HtmlEmail;
4 6
 import org.slf4j.Logger;
5 7
 import org.slf4j.LoggerFactory;
6
-import org.springframework.mail.javamail.JavaMailSenderImpl;
7
-import org.springframework.mail.javamail.MimeMessageHelper;
8 8
 
9
-import javax.mail.internet.MimeMessage;
10
-import java.io.File;
11
-import java.util.Properties;
12
-import java.util.concurrent.ExecutorService;
13
-import java.util.concurrent.Executors;
9
+import java.nio.charset.Charset;
14 10
 
15 11
 /**
16 12
  * 邮件发送.Util
13
+ *
17 14
  * @author xuxueli 2016-3-12 15:06:20
18 15
  */
19 16
 public class MailUtil {
@@ -33,89 +30,42 @@ public class MailUtil {
33 30
 	}
34 31
 
35 32
 	/**
36
-	 * 发送邮件 (完整版) (纯JavaMail)
37
-	 * 
38
-	 * @param toAddress		: 收件人邮箱
39
-	 * @param mailSubject	: 邮件主题
40
-	 * @param mailBody		: 邮件正文
41
-	 * @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
42
-	 * //@param inLineFile	: 内嵌文件
43
-	 * @param attachments	: 附件
33
+	 *
34
+	 * @param toAddress		收件人邮箱
35
+	 * @param mailSubject	邮件主题
36
+	 * @param mailBody		邮件正文
37
+	 * @return
44 38
 	 */
45
-	public static boolean sendMail (String toAddress, String mailSubject, String mailBody, 
46
-			boolean mailBodyIsHtml, File[] attachments){
47
-        try {
48
-			// 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等)
49
-        	JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
50
-        	mailSender.setHost(host); 			// 设置邮件服务主机    
51
-        	mailSender.setUsername(username); 	// 发送者邮箱的用户名    
52
-        	mailSender.setPassword(password); 	// 发送者邮箱的密码    
53
-        	
54
-			// 配置文件,用于实例化java.mail.session
55
-			Properties pro = new Properties();
56
-			pro.put("mail.transport.protocol", "smtp");
57
-			pro.put("mail.smtp.auth", "true");		// 登录SMTP服务器,需要获得授权 (网易163邮箱新近注册的邮箱均不能授权,测试 sohu 的邮箱可以获得授权)
58
-			pro.put("mail.smtp.socketFactory.port", port);
59
-			pro.put("mail.smtp.socketFactory.fallback", "false");
60
-			mailSender.setJavaMailProperties(pro);
61
-			
62
-			// 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage)
63
-			MimeMessage mimeMessage = mailSender.createMimeMessage();						
64
-			MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8");
65
-			
66
-			helper.setFrom(username, sendNick);
67
-			helper.setTo(toAddress);
39
+	public static boolean sendMail(String toAddress, String mailSubject, String mailBody){
68 40
 
69
-			helper.setSubject(mailSubject);
70
-			helper.setText(mailBody, mailBodyIsHtml); 
71
-			
72
-			// 设置收件人抄送的名片和地址(相当于群发)
73
-			//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
41
+		try {
42
+			// Create the email message
43
+			HtmlEmail email = new HtmlEmail();
74 44
 
75
-			// 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
76
-			//helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile);
77
-			
78
-			// 添加附件
79
-			/*if (ArrayUtils.isNotEmpty(attachments)) {
80
-				for (File file : attachments) {
81
-					helper.addAttachment(MimeUtility.encodeText(file.getName()), file);	
82
-				}
83
-			}*/
45
+			//email.setDebug(true);		// 将会打印一些log
46
+			//email.setTLS(true);		// 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
47
+			//email.setSSL(true);
84 48
 
85
-			// 群发
86
-			//MimeMessage[] mailMessages = { mimeMessage };
87
-			
88
-			mailSender.send(mimeMessage);
49
+			email.setHostName(host);
50
+			email.setSmtpPort(Integer.valueOf(port));
51
+			//email.setSslSmtpPort(port);
52
+			email.setAuthenticator(new DefaultAuthenticator(username, password));
53
+			email.setCharset(Charset.defaultCharset().name());
54
+
55
+			email.setFrom(username, sendNick);
56
+			email.addTo(toAddress);
57
+			email.setSubject(mailSubject);
58
+			email.setMsg(mailBody);
59
+
60
+			//email.attach(attachment);	// add the attachment
61
+
62
+			email.send();				// send the email
89 63
 			return true;
90
-		} catch (Exception e) {
64
+		} catch (EmailException e) {
91 65
 			logger.error(e.getMessage(), e);
66
+
92 67
 		}
93 68
 		return false;
94 69
 	}
95
-	
96
-	static int total = 0;
97
-	public static void main(String[] args) {
98
-		
99
-		ExecutorService exec = Executors.newCachedThreadPool();
100
-		for (int i = 0; i < 1; i++) {
101
-			exec.execute(new Thread(new Runnable() {
102
-				@Override
103
-				public void run() {
104
-					while(total < 1){
105
-						String mailBody = "<html><head><meta http-equiv="
106
-								+ "Content-Type"
107
-								+ " content="
108
-								+ "text/html; charset=gb2312"
109
-								+ "></head><body><h1>新书快递通知</h1>你的新书快递申请已推送新书,请到<a href=''>空间"
110
-								+ "</a>中查看</body></html>";
111
-						
112
-						sendMail("931591021@qq.com", "测试邮件", mailBody, true, null);
113
-						System.out.println(total);
114
-						total++;
115
-					}
116
-				}
117
-			}));
118
-		}
119
-	}
120
-	
70
+
121 71
 }

+ 44 - 0
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java ファイルの表示

@@ -0,0 +1,44 @@
1
+package com.xxl.job.dao.impl;
2
+
3
+import com.xxl.job.admin.core.util.MailUtil;
4
+import org.junit.Test;
5
+
6
+import java.text.MessageFormat;
7
+
8
+/**
9
+ * email util test
10
+ *
11
+ * @author xuxueli 2017-12-22 17:16:23
12
+ */
13
+public class MailUtilTest {
14
+
15
+    @Test
16
+    public void registryTest() throws Exception {
17
+
18
+        String mailBodyTemplate = "<h5>监控告警明细:</span>" +
19
+                "<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
20
+                "   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
21
+                "      <tr>\n" +
22
+                "         <td>执行器</td>\n" +
23
+                "         <td>JobKey</td>\n" +
24
+                "         <td>任务描述</td>\n" +
25
+                "         <td>告警类型</td>\n" +
26
+                "      </tr>\n" +
27
+                "   <thead/>\n" +
28
+                "   <tbody>\n" +
29
+                "      <tr>\n" +
30
+                "         <td>{0}</td>\n" +
31
+                "         <td>{1}</td>\n" +
32
+                "         <td>{2}</td>\n" +
33
+                "         <td>调度失败</td>\n" +
34
+                "      </tr>\n" +
35
+                "   <tbody>\n" +
36
+                "</table>";
37
+
38
+        mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1");
39
+
40
+        boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate);
41
+        System.out.println(ret);
42
+    }
43
+
44
+}