spring定时器配置+发送邮件

利用spring定时器发送定时邮件

原创 2015年10月16日 16:56:15

参考地址:http://blog.csdn.net/hyf_javatest/article/details/49179997

参考地址:http://blog.csdn.net/zml_2015/article/details/55004041

参考地址:https://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html


Spring集成Quartz定时任务框架介绍和Cron表达式详解

在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。
我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。
使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。

一、增加所依赖的JAR包
1、增加Spring的Maven依赖

复制代码
 
    
< dependency > < groupId > org.springframework groupId > < artifactId > spring-webmvc artifactId > < version > 4.3.6.RELEASE version > dependency >
复制代码

2、增加Quartz的Maven依赖
复制代码
 
   
< dependency > < groupId > org.quartz-scheduler groupId > < artifactId > quartz artifactId > < version > 2.2.3 version > dependency >

spring 的org.springframework.mail包提供的对邮件的支持。

1.封装一个方法用于发送邮件的方法:

[java] view plain copy
  1. package com.ql.v2.utils;  
  2.   
  3. import java.util.Properties;  
  4. import javax.mail.internet.MimeMessage;  
  5. import org.springframework.mail.SimpleMailMessage;  
  6. import org.springframework.mail.javamail.JavaMailSenderImpl;  
  7. import org.springframework.mail.javamail.MimeMessageHelper;  
  8. /** 
  9.  isValate:是否校验(或者授权):true 
  10.  to:邮件接收者地址数组。:{"***@qq.com","***@qq.com"},因为是数组所以支持群发。 
  11.  subject:邮件主题 
  12.  context:邮件内容 
  13.  */  
  14.      public static void sendEmails( String isValate, String[] to, String subject, String context) throws Exception {  
  15.         //邮件服务器的配置信息  
  16.         JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();  
  17.         senderImpl.setHost("smtp.exmail.qq.com");//发件服务器HOST  
  18.         // 根据自己的情况,设置username  
  19.         senderImpl.setUsername("***");//发件人名称  
  20.         // 根据自己的情况, 设置password  
  21.         senderImpl.setPassword("***");//发件邮箱密码  
  22.           
  23.         Properties pp = new Properties();  
  24.         pp.put("mail.smtp.auth", isValate);//是否校验(或者授权):true  
  25.         senderImpl.setJavaMailProperties(pp);  
  26.           
  27.         // 获取邮件的样板  
  28.         SimpleMailMessage msg = new SimpleMailMessage();  
  29.         msg.setFrom("[email protected]");// 发邮件邮箱  
  30.         msg.setTo(to);  
  31.         msg.setSubject(subject);// 邮件主题  
  32.         msg.setText(context);  
  33.           
  34.         MimeMessage mimeMsg = senderImpl.createMimeMessage();  
  35.         MimeMessageHelper helper = new MimeMessageHelper(mimeMsg, true"UTF-8");  
  36.         helper.setTo(msg.getTo());//邮件接收地址  
  37.         helper.setSubject(msg.getSubject());//邮件主题  
  38.         helper.setFrom(msg.getFrom(), "别名");//邮件发送人-别名  
  39.         helper.setText(msg.getText(), true);//邮件内容  
  40.         senderImpl.send(mimeMsg);//发送邮件  
  41.     }  

2.定义一个发送邮件的定时类


[java] view plain copy
  1. package com.ql.v2.controller.tasks;  
  2.   
  3. import java.io.File;  
  4. import org.apache.commons.io.FileUtils;  
  5. import org.springframework.core.io.ClassPathResource;  
  6. import com.ql.v2.utils.SendEmailUtil;  
  7.   
  8. /** 
  9.  * 自动统计类 
  10.  * @author huayafei 
  11.  * 
  12.  */  
  13. public class AutoStatisticsTask {     
  14.     /** 
  15.      * 自动统计微信端定存宝、活期宝的投资金额与人数信息。 
  16.      */  
  17.     public void autoStatisticWxInfo(){  
  18.         try {  
  19.             //读取文件,然后发送邮件。  
  20.             ClassPathResource resource=new ClassPathResource("/");  
  21.             String filepath=resource.getFile().getParent()+"/other_pages/statistic.html";  
  22.             //利用oapche提供的方法把一个文件读取成字符串  
  23.             String html=FileUtils.readFileToString(new File(filepath),"UTF-8");  
  24.             /* 
  25.              * 群发邮件 
  26.              */  
  27.             String isValate = "true";//邮件授权  
  28.             String[] to = {"***@qinlian.me","***@qq.com"};//收件人  
  29.             String subject = "微信端投资统计记录";//邮件主题  
  30.             //调用发送邮件的方法  
  31.             SendEmailUtil.sendEmails(isValate, to, subject, html);  
  32.         } catch (Exception e) {  
  33.             throw new RuntimeException(e.getMessage(),e);  
  34.         }  
  35.     }  
  36. }  

3.设置spring配置文件定时调用发送邮件的方法。

[html] view plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">  
  7.       
  8.       
  9.     <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  10.         <property name="triggers">  
  11.             <list>  
  12.                 <ref bean="autoStatistics_time" />  
  13.             list>  
  14.         property>  
  15.     bean>  
  16.       
  17.       
  18.     <bean id="autoStatisticsTask" class="com.ql.v2.controller.tasks.AutoStatisticsTask"/>  
  19.       
  20.       
  21.     <bean id="autoStatisticsTaskProperties" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  22.         <property name="targetObject" ref="autoStatisticsTask">property>  
  23.         <property name="targetMethod" value="autoStatisticWxInfo">property>  
  24.         <property name="concurrent" value="false">property>   
  25.     bean>  
  26.       
  27.       
  28.     <bean id="autoStatistics_time" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  29.         <property name="jobDetail" ref="autoStatisticsTaskProperties">property>  
  30.         <property name="cronExpression" value="0 0/1 * * * ?">property>   
  31.     bean>  
  32. beans>  

sping配置文件关联图解:

spring定时器配置+发送邮件_第1张图片




spring4.3.6与quartz 2.2.3集成出现以下问题

[html] view plain copy
  1. Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'articleBatchRunTrigger' defined in class path resource [spring-quartz.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean  
  2.     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1385)  
  3.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:641)  
  4.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609)  
  5.     at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484)  
  6.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:425)  
  7.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:403)  
  8.     at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:220)  
  9.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1260)  
  10.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)  
  11.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)  
  12.     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)  
  13.     ... 15 more  
  14. Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean  
  15.     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)  
  16.     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)  
  17.     at java.security.AccessController.doPrivileged(Native Method)  
  18.     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)  
  19.     at java.lang.ClassLoader.loadClass(ClassLoader.java:425)  
  20.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)  
  21.     at java.lang.ClassLoader.loadClass(ClassLoader.java:358)  
  22.     at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)  
  23.     at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:401)  
  24.     at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1432)  
  25.     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1377)  
  26.     ... 25 more  

实际上是因为quartz的配置信息用的是旧版本、而依赖的确是高版本的jar包

在quartz 1.8.6及以前版本的时候 调度触发器 依赖的类是 org.springframework.scheduling.quartz.CronTriggerBean

在2.xx版本之后就改为了org.springframework.scheduling.quartz.CronTriggerFactoryBean

因此当你依赖2.x.x版本之后只需将调度触发器的依赖类改为 org.springframework.scheduling.quartz.CronTriggerFactoryBean即可


你可能感兴趣的:(j2ee)