Spring 定时器 定时访问数据库并发送邮件
我这里有两个案例的方法:
第一种:使用Spring quartz:
我这里使用的jar:spring-context-support.jar、quartz-1.6.5.jar
==============applicationContext.xml配置=================
<!--定时器service-->
<bean id="timerTaskServices" class="com.gzbugu.service.TimerTaskServices.impl.TimerTaskServicesImpl" >
<property name="commonDao" ref="commonDao"/>
</bean>
<bean id="checkYsyj" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="timerTaskServices" /><!--托管业务层-->
</property>
<property name="targetMethod">
<value>checkYsTarsk</value><!--执行的方法-->
</property>
</bean>
<!--执行时间-->
<bean id="checkYsyjTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 多个可用 <property name="jobDetail" ref="job****" />-->
<!--名称必须:jobDetail,否则会报错-->
<property name="jobDetail"><ref bean="checkYsyj" /></property>
<property name="cronExpression">
<!-- 每天凌晨23:50分执行 -->
<!-- <value>0 50 23 * * ?</value> -->
<!--一秒钟调用一次-->
<value>0/1 * * * * ?</value>
</property>
</bean>
<!--定时器列表-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="triggers">
<list><ref local="checkYsyjTrigger" /></list>
</property>
<!--
启用jobstore的RAMJobStore(内存存储的)模式,配置如下:
<property name="quartzProperties"> <props>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
</props>
</property>
-->
</bean>
================web.xml配置(注:spring环境配置不写了)========================
<!-- Spring 监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
=================业务方法==========================
public class TimerTaskServicesImpl implements TimerTaskServices {
public ICommonDao commonDao;
@Override
public void checkYsTarsk() {
System.out.println("调用成功....");
String hql = " from ProjectBase o ";
List<ProjectBase> list=commonDao.findByHql(hql);//访问数据库
System.out.println(list.get(0).getProjectName());
sendEmail("发送人的邮箱", "收件人的邮箱","发件人的密码","标题","内容");//发送邮件方法
System.out.println("执行成功....");
}
/**
* http://www.cnblogs.com/qgc88/
* @param sendFrom
* 发送方
* @param sendTo
* 接收方
* @param passWord
* 发送方邮箱密码
* @param title
* 发送标题
* @param count
* 发送内容
* @return success 和 error
*/
public static String sendEmail(String sendFrom, String sendTo,
String passWord, String title, String count) {
try {
String from = sendFrom.trim();// 发送者
String to = sendTo.trim();// 接受者
String subject = title.trim();// 主题
String content = count.trim();// 内容
String password = passWord.trim();// 发送者邮箱密码
String path = "null";// 附件的路径
String mailserver = "smtp."
+ from.substring(from.indexOf('@') + 1, from.length()); // 在Internet上发送邮件时的代码(smtp服务器地址)
// String mailserver = "wanggh"; //在局域网内发送邮件时的代码
Properties prop = new Properties();
prop.put("mail.smtp.host", mailserver);
prop.put("mail.smtp.auth", "true");
prop.put("mail.transport.protocol", "smtp");
Session sess = Session.getDefaultInstance(prop);
sess.setDebug(true);
// 设定传送邮件的发信人
MimeMessage message = new MimeMessage(sess);
message.setFrom(new InternetAddress(from)); // 给消息对象设置发件人
// 设置收件人
String toArr[] = to.split(",");
InternetAddress[] to_mail = new InternetAddress[toArr.length];
for (int i = 0; i < toArr.length; i++) {
to_mail[i] = new InternetAddress(toArr[i]);
}
message.setRecipients(Message.RecipientType.BCC, to_mail);
// 设置主题
message.setSubject(subject);
Multipart mul = new MimeMultipart(); // 新建一个MimeMultipart对象来存放多个BodyPart对象
BodyPart mdp = new MimeBodyPart(); // 新建一个存放信件内容的BodyPart对象
mdp.setContent(content, "text/html;charset=gb2312");
mul.addBodyPart(mdp); // 将含有信件内容的BodyPart加入到MimeMulitipart对象中
if (!"null".equals(path)) { // 当存在附件时
// 设置信件的附件(用本机上的文件作为附件)
mdp = new MimeBodyPart(); // 新建一个存放附件的BodyPart
String adjunctname = new String(path.getBytes("GBK"),
"ISO-8859-1"); // 此处需要转码,否则附件中包括中文时,将产生乱码
path = (System.getProperty("java.io.tmpdir") + "/" + path)
.replace("\\", "/");
System.out.println("路径:" + path);
FileDataSource fds = new FileDataSource(path);
DataHandler handler = new DataHandler(fds);
mdp.setFileName(adjunctname);
mdp.setDataHandler(handler);
mul.addBodyPart(mdp);
}
message.setContent(mul); // 把mul作为消息对象的内容
message.saveChanges();
Transport transport = sess.getTransport("smtp");
// 以smtp方式登录邮箱,第1个参数是发送邮件用的邮件服务器SMTP地址,第2个参数为用户名,第3个参数为密码
// qq邮箱POP3服务器(端口995)
// SMTP服务器(端口465或587)
transport.connect(mailserver, from, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return "success";
} catch (Exception e) {
System.out.println(e.getMessage());
return "error";
}
}
public ICommonDao getCommonDao() {
return commonDao;
}
public void setCommonDao(ICommonDao commonDao) {
this.commonDao = commonDao;
}
}
=================方法一结束========================
------------------------------------------------------------------------------
===================方法二===============
package com.qgc.card.JTool;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.qgc.card.services.servicesImpl.MessageServicesImpl;
/**
* 定时器
* @author http://www.cnblogs.com/qgc88/
*
*/
public class MyTimerTask implements ServletContextListener {
private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
System.out.println("定时器销毁");
}
@Override
public void contextInitialized(ServletContextEvent event) {
//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
timer = new Timer(true);
event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到
timer.schedule(new MessageServicesImpl(event.getServletContext()),0,24*60*60*1000);//一天调用一次类MessageServicesImpl
System.out.println("定时器已启动");
}
}
=================MessageServicesImpl=============================
package com.qgc.card.services.servicesImpl;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import com.qgc.card.services.UserServices;
/**
* 定时器的类
*
* @author http://www.cnblogs.com/qgc88/
*
*/
public class MessageServicesImpl extends TimerTask {
private ServletContext context = null;
public MessageServicesImpl(ServletContext context) {
this.context = context;
}
@Override
public void run() {
timeMessage();//方法
}
public ServletContext getContext() {
return context;
}
public void setContext(ServletContext context) {
this.context = context;
}
}
@SuppressWarnings("deprecation")
public void timeMessage(){
JToolAccess jdbc=new JToolAccess();//工具类
Users users=new Users();
try {
Connection conn=jdbc.qryConnJDBC();
System.out.println("监听成功..");
jdbc.ps = conn.prepareStatement("select * from Users where statsu<>'-1' ");
ResultSet rss = jdbc.ps.executeQuery();
while (rss.next()) {
System.ou.println(rss.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("监听异常:"+e.getMessage());
}finally{
jdbc.closeConn();
}
}
==================jdbc工具类JToolAccess===========================
package com.qgc.card.JTool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
public class JToolAccess {
public ResultSet rs = null;
public PreparedStatement ps = null;
public Connection conn = null;
public void closeConn() {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Properties getProperties() {
Properties properties = new Properties();
try {
String getURL=getClass().getResource("/").getPath();
System.out.println(getURL + "META-INF/db.Properties");
File file = new File(getURL + "META-INF/db.Properties");
if (!file.exists()) {
file.createNewFile();
properties
.setProperty("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
properties.setProperty("dialect",
"org.hibernate.dialect.SQLServerDialect");
}
FileInputStream inStream = new FileInputStream(file);
properties.load(inStream);
inStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return properties;
}
public Connection qryConnJDBC() {
try {
String url =getProperties().getProperty("url");
Class.forName(getProperties().getProperty("driver"));
conn = DriverManager.getConnection(url,getProperties().getProperty("uname"),getProperties().getProperty("pwd"));
System.out.println("数据库连接成功!");
} catch (Exception e) {
System.out.println("数据库连接失败,系统消息为:" + e.getMessage()
+ ",请检查您的数据库信息!");
}
return conn;
}
public PreparedStatement getPs() {
return ps;
}
public void setPs(PreparedStatement ps) {
this.ps = ps;
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
}
==========web.xml配置(注:spring环境配置不写了)===================
<!-- 定时器-->
<listener>
<listener-class>com.qgc.card.JTool.MyTimerTask</listener-class>
</listener>
Spring 定时器 定时访问数据库并发送邮件的更多相关文章
- Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版
一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...
- Spring实战6:利用Spring和JDBC访问数据库
主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...
- Spring系列之访问数据库
一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结合JDBC API的最佳实践和统一集成各种ORM方案,完成Java平台的数据访问. 二.JDBC API的最佳实践 Spring ...
- Springboot 系列(十)使用 Spring data jpa 访问数据库
前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...
- spring boot 定时备份数据库
第一步 :添加mysqldump.exe 进环境变量 第二步 新建一个spring boot 项目,连接数据库 spring.datasource.url=jdbc:mysql://localhos ...
- spring boot访问数据库
1. Spring JAP 基本使用说明: Spring boot 访问数据库基本上都是通过Spring JPA封装的Bean作为API的,Spring JPA 将访问数据库通过封装,只要你的类实现了 ...
- Spring Boot实战之数据库操作
上篇文章中已经通过一个简单的HelloWorld程序讲解了Spring boot的基本原理和使用.本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是Jdb ...
- Spring Boot(二):数据库操作
本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...
- 使用JdbcTemplate访问数据库
参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...
随机推荐
- chrom控制台常用方法
console.assert对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台 . console.count(这个方法非常实用哦)当你想统计代码被执行的次数 console. ...
- 爬虫4_python2
import urllib2 response = urllib2.urlopen("https://www.baidu.com") print response.read() 构 ...
- java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框
LoginDialog类的代码修改如下: package com.swift.frame; import java.awt.EventQueue; import java.awt.event.Acti ...
- iOS HmacSHA1加密 和 MD5 Base64加密 --iOS开发系列---项目中成长的知识五
项目中开发中需要对一些数据进行加密后和服务器验证是否是我们客户端发出的请求! 方案是服务器定的,使用HmacSHA1加密和MD5 Base64加密 加密过程比较复杂 1.获取格林威治时间 2.用bas ...
- ios xmpp demo
为了方便程序调用,我们把XMPP的一些主要方法写在AppDelegate中 在AppDelegate.m下这几个方法为: [java] view plaincopy -(void)setupStrea ...
- clover如何使用UEFI引导和EFI驱动选择
EFI分区实际上是一个FAT格式的分区,不一定要是第一个分区,GPT磁盘下任何一个FAT文件格式的分区都可以用来放EFI引导文件.主板UEFI先默认引导你所设置的第一优先启动分区下的\EFI\boot ...
- 洛谷 P2872 道路建设
https://www.luogu.org/problemnew/show/P2872 算是比较裸的并查集了,已经有路的两个点之间建一条代价为0的边,路径长度计算两点之间的距离,做并查集就好咯. #i ...
- C++系统学习一:基本数据类型和变量
程序语言 程序语言最基本的特征 整型.字符型等内置类型 变量,用来为对象命名 表达式和语句,操纵上述数据类型的具体值 if等控制结构 函数,定义可供随时调用的计算单元 程序语言的扩展 自定义数据类型 ...
- 开启和连接mysql服务器(win10为例)
1.windows图标右键,选择“计算机管理”: 2.展开左边的“ 服务和应用程序” 选项,点击“服务",找到 MySQL 服务器,点击左侧的 "启动",即可完成 MyS ...
- Ubuntu18.04 下联想电脑 无法连接WIFI问题解决
联想笔记本电脑Ubuntu系统下无法开启无线硬件开关的解决.总结了3个方法,方便以后使用. 方法一: 一.问题描述: 本人使用联想拯救者14IFI笔记本在安装Ubuntu系统时会出现无线硬件开关关闭的 ...