起因:最近公司服务器老是莫名其妙的死掉。导致的就是应用停止服务后因为没有监控而无法及时知道服务运行情况。故打算手写一个监控程序,用来监控应用服务是否正常。
解决方案:本次有两种解决方案,最简单的就是使用流程系统的发送短信功能,后来一想,流程是在内网环境运行的。无法满足要求。想想自己刚好有台闲置的外网服务器故只能使用发邮件的方式提醒了。
首先,发送邮件的jar包是不包含在jdk里面的。可以从 Java 网站下载最新版本的JavaMail地址是:https://www.oracle.com/technetwork/java/javamail/index.html,打开网页右侧有个 Downloads 链接,点击它下载。
下载完成后,打开eclipse。新建一个java工程。将这个mail.jar包导入到工程里面
1.首先是发送邮件的方法。发送邮件需要使用的两个类,分别是Session和MimeMessage。
2.Session这个类中保存了邮件服务器的地址,端口等信息。获取方式为
1 Session session = Session.getDefaultInstance(props);
复制
查看该构造函数,可以看到,这里需要传入一个Properties。这个Properties其实是保存了邮件服务器的信息,包括端口,邮件服务器地址等信息。这里需要配置三个属性即可。即邮件协议,端口,传输协等。
1//设置邮箱地址,端口信息等
2 Properties props = new Properties();
3 props.setProperty("mail.transport.protocol", "smtp");
4 props.setProperty("mail.smtp.host", "mail-s.ccssoft.com.cn");
5 props.setProperty("mail.smtp.port", "25");复制
第二行代码中,因为是用的发送,所以选择mail.transport.protocol,类型选择smtp。如果是接收邮件的话,就要选择mail.store.protocol了,接收时,可选择pop3或者imap协议。获取到Session后,就可以开始发送邮件了
1//设置邮件内容
2 MimeMessage msg = new MimeMessage(session);
3 // 设置发送邮件方
4 InternetAddress fromAddress = new InternetAddress(ACCOUT,"罗富贤", "utf-8");
5 msg.setFrom(fromAddress);
6 //设置收件方
7 InternetAddress receiveAddress = new InternetAddress("805277811@qq.com", "test", "utf-8");
8 msg.setRecipient(RecipientType.TO, receiveAddress);
9 msg.setSubject("244故障警告", "utf-8");
10 msg.setText("APP服务已停止响应,请确认~");
11 msg.setSentDate(new Date());
12 msg.saveChanges();
13
14 Transport transport = session.getTransport();
15 transport.connect(SMTPSERVER,ACCOUT, PWD);
16 transport.sendMessage(msg, msg.getAllRecipients());
17 transport.close();复制
完成后,记得关闭传输。完整的代码如下:
1public void sendEmail() throws Exception {
2 //设置邮箱地址,端口信息等
3 Properties props = new Properties();
4 props.setProperty("mail.transport.protocol", "smtp");
5 props.setProperty("mail.smtp.host", "mail-s.ccssoft.com.cn");
6 props.setProperty("mail.smtp.port", "25");
7
8 Session session = Session.getDefaultInstance(props);
9 session.setDebug(true);//打开后可看到发送详情
10 //设置邮件内容
11 MimeMessage msg = new MimeMessage(session);
12 // 设置发送邮件方
13 InternetAddress fromAddress = new InternetAddress("luofuxian@ccssoft.com.cn","罗富贤", "utf-8");
14 msg.setFrom(fromAddress);
15 //设置收件方
16 InternetAddress receiveAddress = new InternetAddress("805277811@qq.com", "test", "utf-8");
17 msg.setRecipient(RecipientType.TO, receiveAddress);
18 msg.setSubject("244故障警告", "utf-8");
19 msg.setText("APP服务已停止响应,请确认~");
20 msg.setSentDate(new Date());
21 msg.saveChanges();
22
23 Transport transport = session.getTransport();
24 transport.connect("mail-s.ccssoft.com.cn","luofuxian@ccssoft.com.cn", "这里是密码");
25 transport.sendMessage(msg, msg.getAllRecipients());
26 transport.close();
27 }复制
完成后,试运行,可以看到。收件箱中已经成功的收到了此邮件。
至此,发件功能已经完成,接下来就是检测服务是否连通了,很见到,可以启动一个线程,每隔5秒钟就去请求一次APP服务端,若有返回,则说明请求成功,如无返回,则证明服务已经关闭或者停止相应,就开始发送邮件提醒。
1public void monitor244() {
2 new Thread(new Runnable() {
3 @Override
4 public void run() {
5 long last = System.currentTimeMillis();
6 InputStream in = null;
7 while(true) {
8 try {
9 Thread.sleep(5000);//每隔5秒钟请求一次
10 URL url = new URL(remoteServerAddr);
11 //打开到此 URL 的连接并返回一个用于从该连接读入的
12 InputStream in = url.openStream();
13 System.out.println("连接正常"+"-------------"+sdf.format(new Date()) );
14 } catch (Exception e1) {
15 // TODO Auto-generated catch block
16 System.out.println("连接异常"+e1.getMessage());
17 if(first) {
18 try {
19 sendEmail();
20 } catch (Exception e) {
21 // TODO Auto-generated catch block
22 e.printStackTrace();
23 }
24 first = false;
25 continue;
26 }
27 long current = System.currentTimeMillis();
28 if((current-last)>sendTimes) {
29 last = current;
30 try {
31 sendEmail();
32 } catch (Exception e) {
33 // TODO Auto-generated catch block
34 e.printStackTrace();
35 }
36 }
37 }finally {
38 if(null != in) {
39 try {
40 in.close();
41 } catch (IOException e) {
42 // TODO Auto-generated catch block
43 e.printStackTrace();
44 }//关闭此输入流并释放与该流关联的所有系统资源。
45 }
46 }
47 }
48 }
49 }).start();
50 System.out.println("244监听已启动");
51 }复制
完成后,导出jar包, 放到外网服务器运行即可。