我这里有两个案例的方法:

第一种:使用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 定时器 定时访问数据库并发送邮件的更多相关文章

  1. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  2. Spring实战6:利用Spring和JDBC访问数据库

    主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...

  3. Spring系列之访问数据库

    一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结合JDBC API的最佳实践和统一集成各种ORM方案,完成Java平台的数据访问. 二.JDBC API的最佳实践 Spring ...

  4. Springboot 系列(十)使用 Spring data jpa 访问数据库

    前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...

  5. spring boot 定时备份数据库

    第一步 :添加mysqldump.exe 进环境变量 第二步  新建一个spring boot 项目,连接数据库 spring.datasource.url=jdbc:mysql://localhos ...

  6. spring boot访问数据库

    1. Spring JAP 基本使用说明: Spring boot 访问数据库基本上都是通过Spring JPA封装的Bean作为API的,Spring JPA 将访问数据库通过封装,只要你的类实现了 ...

  7. Spring Boot实战之数据库操作

    上篇文章中已经通过一个简单的HelloWorld程序讲解了Spring boot的基本原理和使用.本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是Jdb ...

  8. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

  9. 使用JdbcTemplate访问数据库

    参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...

随机推荐

  1. 验证IP端与数据库Ip端是否重复!!!

    select COUNT(id) from house_info_config hic where (hic.ip_start <![CDATA[<=]]> #{ipend} AND ...

  2. 第1节 flume:13、14、更多flume案例一,通过拦截器实现不同类型的数据区分

    1.6.flume案例一 1. 案例场景 A.B两台日志服务机器实时生产日志主要类型为access.log.nginx.log.web.log 现在要求: 把A.B 机器中的access.log.ng ...

  3. WinForm各种关闭

    Appication.Exit(); Environment.Exit(); System.Threading.Thread.CurrentThread.Abort(); Process.GetCur ...

  4. 746. Min Cost Climbing Stairs@python

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  5. hihoCoder-1098-kruskal

    如果起始点和终止点的父节点相同,就说明它们就已经在同一个连通分量里面,说明,起始点和终止点在此之前就已经被连入同一个分量之中,如果此时还将起始点和终止点连入此分量,就会形成回路,想象一个三角形,你大概 ...

  6. 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card

    巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...

  7. perl学习之:理解贪婪匹配和最小匹配之间的区别

    正则表达式的新手经常将贪婪匹配和最小匹配理解错误.默认情况下,Perl 的正则表达式是“贪婪地”,也就是说它们将尽可能多地匹配字符. 下面的脚本打印出“matched defgabcdef”,因为它尽 ...

  8. Perl学习之四:语句(续)

    循环控制:1.last 退出标签的语句块2.next 3.redo不推荐,循环次数不可控 4.goto不推荐.***************************************标签: 先 ...

  9. 《linux设备驱动开发详解》笔记——11内存与IO访问

    内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...

  10. Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)

    摘要: Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse.render.redirect) 一.Web框架概述: Python三大主流Web ...