Spring定时任务使用和如何使用邮件监控服务器
Spring相关的依赖导入进去,即可使用spring的定时任务!
<!-- spring核心包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.13.RELEASE</version> </dependency>
定时任务是开发中常用的,比如订单查询,一位客人订购的某个东西,但是尚未支付,超过订单时效期自动失效,那么又是怎么样知道订单的时效性过呢?定时任务,可以每分钟或者每秒钟进行查询。
定时任务的应用是非常广的,下面应用下监控服务器,虽然说现在开源监控软件挺多的,什么zabbix,nagios或者其他等等。下面我将使用代码监控服务器:
首先准备邮件的依赖:
<!-- 发邮件 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.2</version> <scope>provided</scope> </dependency>
邮件工具类:
import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; public class MailUtils { public static void sendMail(String email, String emailMsg) throws AddressException, MessagingException { // 1.创建一个程序与邮件服务器会话对象 Session Properties props = new Properties(); props.setProperty("mail.transport.protocol", "SMTP"); props.setProperty("mail.host", "smtp.163.com"); props.setProperty("mail.smtp.auth", "true");// 指定验证为true // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("123@163.com", "123"); } }; Session session = Session.getInstance(props, auth); // 2.创建一个Message,它相当于是邮件内容 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("123@163.com")); // 设置发送者 message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者 message.setSubject("邮件告警"); message.setContent(emailMsg, "text/html;charset=utf-8"); // 3.创建 Transport用于将邮件发送 Transport.send(message); } }
监控服务器类:
package cn.pms.monitor; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import javax.mail.MessagingException; import javax.mail.internet.AddressException; import cn.pms.util.MailUtils; public class MonitorUrl { public static void testUrlWithTimeOut2016(String urlString,int timeOutMillSeconds){ long lo = System.currentTimeMillis(); URL url; try { url = new URL(urlString); URLConnection co = url.openConnection(); co.setConnectTimeout(timeOutMillSeconds); co.connect(); System.out.println("连接可用"); } catch (Exception e1) { System.out.println("连接打不开!"); url = null; emailMonitor2016(); } System.out.println(System.currentTimeMillis()-lo); } public static void testUrlWithTimeOut2018(String urlString,int timeOutMillSeconds){ long lo = System.currentTimeMillis(); URL url; try { url = new URL(urlString); URLConnection co = url.openConnection(); co.setConnectTimeout(timeOutMillSeconds); co.connect(); System.out.println("连接可用"); } catch (Exception e1) { System.out.println("连接打不开!"); url = null; emailMonitor2018(); } System.out.println(System.currentTimeMillis()-lo); } public static void testUrlWithTimeOut1818(String urlString,int timeOutMillSeconds){ long lo = System.currentTimeMillis(); URL url; try { url = new URL(urlString); URLConnection co = url.openConnection(); co.setConnectTimeout(timeOutMillSeconds); co.connect(); System.out.println("连接可用"); } catch (Exception e1) { System.out.println("连接打不开!"); url = null; emailMonitor1818();; } System.out.println(System.currentTimeMillis()-lo); } public static void testUrlWithTimeOut1616(String urlString,int timeOutMillSeconds){ long lo = System.currentTimeMillis(); URL url; try { url = new URL(urlString); URLConnection co = url.openConnection(); co.setConnectTimeout(timeOutMillSeconds); co.connect(); System.out.println("连接可用"); } catch (Exception e1) { System.out.println("连接打不开!"); url = null; emailMonitor1616(); } System.out.println(System.currentTimeMillis()-lo); } public static void emailMonitor2016() { try { MailUtils.sendMail("123@qq.com", "tomcat服务器端口为2016宕机了"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void emailMonitor2018() { try { MailUtils.sendMail("123@qq.com", "tomcat服务器端口为2018宕机了"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void emailMonitor1818() { try { MailUtils.sendMail("1236@qq.com", "tomcat服务器端口为1818宕机了"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void emailMonitor1616() { try { MailUtils.sendMail("123@qq.com", "tomcat服务器端口为1616宕机了"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
具体定时任务类:
@Component public class QuartzJob { private static Logger logger = Logger.getLogger(QuartzJob.class); @Scheduled(cron = "0 0/1 * * * ? ") public void test() { MonitorUrl.testUrlWithTimeOut2018("http://www.yc520.com:2018/", 2000); MonitorUrl.testUrlWithTimeOut1616("http://www.yc520.com:1616/", 2000); logger.info("每分钟执行" + System.currentTimeMillis()); } @Scheduled(cron = "0 10 0 * * ?") public void monitorServerTest() { System.out.println("每10分钟监控一次2018服务器和1616服务器"); MonitorUrl.testUrlWithTimeOut2018("http://www.yc520.com:2018/", 2000); MonitorUrl.testUrlWithTimeOut1616("http://www.yc520.com:1616/", 2000); } @Scheduled(cron="0 30 0 * * ?") public void monitorServer() { System.out.println("每30分钟监控一次1818测试服务器"); MonitorUrl.testUrlWithTimeOut1818("http://www.yc520:1818/", 2000); } }
由此就可以达到监控服务器的目的,当然这只是小试牛刀,而且也不够全面,当然也存在问题,如果是每分钟定时任务检测,突然一台服务器挂了,那么将会源源不断的发送邮件,163邮件是有限的,而且频繁的可能会被当成垃圾邮件,我只需要知道一条信息,某某服务器宕机了,一遍就可以,最后给我发三十遍,如此的话,大量的无效邮件很浪费资源,而且浪费时间。所以说,本文只是一个服务器监控小示例,实际开发中,切勿直接拿来用,最好要有相关的判断和逻辑。这样才能比较高效,达到预期期望。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述