问题场景: 在一个系统的流程节点中 用户点击后发现查不到下一个流程节点,后台查看Linux日志,报SMTP的错误
错误原因: 由于流程走向下一个节点需要发送邮件,这个 500 5.1.1 报的是邮件地址不正确,并不存在该邮件地址,进而报发送错误。
解决方案:
1、 必须查出哪个用户的邮件地址有问题,也就是必须过滤掉可用的邮件,用排除法,我这里的log日志有几百行的发送记录,如果直接找是搞不定的。
2、 我将其这几百行关于发送方法的记录copy出来,放在一个文本中,根据数据的特点,用IO进行过滤。
这里是我写的IO代码,File文件行处理即可。
public class GrepLine {
public static void FileOperateTest() throws IOException {
File dfile = new File("E:\\mailerror.txt");
FileReader fr = new FileReader(dfile);
BufferedReader br = new BufferedReader(fr);
File writeFile = new File("E:\\writeFile\\" + dfile.getName());
// 新建文件
if (!writeFile.exists()) {
writeFile.createNewFile();
}
FileWriter fw = new FileWriter(writeFile);
BufferedWriter bw = new BufferedWriter(fw);
int linenum = 0;
String str = null;
try {
while ((str = br.readLine()) != null) {
// 这里对每行数据进行操作
if (str.length() > 15) {
StringBuffer newStr = new StringBuffer();
int i = 0;
newStr.append("'");
for (char c : str.toCharArray()) {
i++;
if (c == '@'){
newStr.append("',");
newStr.append(" \n ");
break;
}
newStr.append(c);
if (i > 15)
break;
}
if (i < 15)
str = newStr.toString();
else
str = "";
} else
str = "";
bw.write(str);
if (linenum++ == 100) {
bw.flush();
linenum = 0;
}
}
} catch (Exception e) {
// TODO: handle exception
} finally {
// 注意先关闭写入流 并且buffer缓存流必须最先关闭,不然就会报错,后再关闭读取流,记住先打开的后关闭
if (bw != null)
bw.close();
if (fw != null)
fw.close();
if (fr != null)
fr.close();
if (br != null)
br.close();
}
}
public static void main(String[] args) {
try {
FileOperateTest();
System.out.println("过滤成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样执行发现,成功发送了用户是哪些
然后在数据库中进行过滤,你肯定知道你这个SMTP邮件错误产生取的要发送的用户列表的,我这里是从流程历史表中取的
一过滤查找,用PLSQL进行过滤
SELECT FH.APPROVER_EMP, FH.Approver_Name_Eng
FROM FLOW_HISTORY FH
WHERE BASE_UID = '190700000578'
AND FH.APPROVER_DEPT = '000000003000'
AND FH.APPROVER_NAME_ENG NOT IN
(SELECT S.ALTERNATE_NAME
FROM USER_DETAILS S
WHERE S.REAL_NAME IN
('tcheng', 'yhuang', 'lshuang', 'wye', 'ybai', 'yzhang4',
'ttzhou', 'tfzhou', 'cftan', 'lhyan', 'yliu1', 'jliu3',
'apren', 'dsliao', 'sqxie', 'zlyu', 'yxzhang', 'mxliu',
'swang', 'ylniu', 'gccheng', 'xfzeng')))
查出最终有两个用户已离职,邮箱被注销,当在该系统中他的账户仍然还在启用,在业务中涉及到他们两个人就的邮件发送就出现该 BUG了。
其实这种在中小公司是很常见的,数千人的公司,人资系统将其员工注销了,当可能未与其他的业务系统对接,其他业务系统运行该员工相关信息导致出现错误。