8.1.1任务调度简介
Spring包含了对定时调度服务的内置支持类。当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler。二者都可以通过FactoryBean,分别指向Timer或Trigger实例的引用进行配置。更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingFactoryBean操作)。Spring 还包含有用于线程池调度的类,它针对Java 1.3,1.4,5和JEE环境的差异都进行了抽象。
8.1.2 Spring中使用Quartz
Quartz 是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。而在日常开发中我们也是优先使用Quartz进行计划任务的调度。
Scheduler代表一个Quartz的独立运行容器我们的任务需要由它来进行执行,请看下面的代码清单
代码清单1
<bean id="scheduler" class="org.springframework.scheduling.quartz.
SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="estimateLogTriggerQuartz" />
</list>
</property>
</bean>
<!—- 配置触发器调度的Bean -->
<bean id="estimateLog" class="org.springframework.scheduling.quartz.
MethodInvokingJobDetailFactoryBean">
<!-- 引用一个Bean -->
<property name="targetObject" ref="estimateLogTrigger" />
<!-- 指定目标Bean的方法 -->
<property name="targetMethod" value="doSaveEstimateLog" />
</bean>
<!—- 配置触发器 -->
<bean id="estimateLogTriggerQuartz" class="org.springframework.scheduling.quartz. CronTriggerBean">
<property name="jobDetail" ref="estimateLog" />
<!-- 每月最后一天23.55执行 -->
<property name="cronExpression" value="0 55 23 L * ?" />
</bean>
代码清单1中配置了一个名为SchedulerFactoryBean、CronTriggerBean和MethodInvokingJobDetailFactoryBean的Bean这是Spring为了降低Quartz的使用难度,为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBean,SchedulerFactoryBean的triggers的属性为triggers[]类型,可以通过该属性注册多个Trigger,Bean estimateLogTriggerQuartz定义了jobDetail执行的时间和执行的方法。定义触发器执行的就是0 55 23 L * ? 这段表达式,这个表达式定义了在每月的最后一天L的23:55执行。
8.2 Spring的邮件支持
8.2.1Spring邮件的简介
Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理。Spring在org.springframework.mail.javamail包下提供了对JavaMail邮件系统的支持,通过这些支持类,编写JavaMail邮件发送程序变得轻松易行。
1)发送普通邮件
代码清单1
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
public class SendMail {
public static void main(String args[]){
JavaMailSenderImpl senderimpl = new JavaMailSenderImpl();
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");
senderimpl.setJavaMailProperties(properties);
// 设定mail server
senderimpl.setHost("smtpcom.263xmail.com");
//设置用户名和密码
senderimpl.setUsername("tony");
senderimpl.setPassword("tony");
//建立邮件消息
SimpleMailMessage mailmessage = new SimpleMailMessage();
//设置收件人
String[] array = new String[]{"myMail@163.com",
"yourMail@263.com"};
mailmessage.setTo(array);
//设置寄件人
mailmessage.setFrom("myMail@163.com");
//设置邮件主题
mailmessage.setSubject("Test");
//设置邮件内容
mailmessage.setText("Test Send Mail");
//发送邮件
senderimpl.send(mailmessage);
System.out.println("Send success.....");
}
}
代码清单1中首先初始化了一个JavaMailSenderImpl实例,然后设置邮件服务器的端口地址,发送人的帐户和密码。SimpleMailMessage对象代表了邮件信息,包含一系列的属性。通过代码清单1我们可以很方便的发送一封邮件或者群发邮件。下面再介绍一下发送HTML格式的邮件。
2)发送HTML邮件
代码清单2
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
public class SendMail {
public static void main(String args[]){
JavaMailSenderImpl senderimpl = new JavaMailSenderImpl();
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");
senderimpl.setJavaMailProperties(properties);
// 设定mail server
senderimpl.setHost("smtpcom.263xmail.com");
//设置用户名和密码
senderimpl.setUsername("tony");
senderimpl.setPassword("tony");
//建立邮件消息
MimeMessage mimeMessage = senderimpl.createMimeMessage();
MimeMessageHelper messagehelper = new MimeMessageHelper(mimeMessage);
try {
//设置寄件人
messagehelper.setFrom("myMail@163.com");
//设置收件人
messagehelper.setTo("yourMail@163.com");
//设置邮件主题
messagehelper.setSubject("Test HTML");
//true 表示启动HTML格式的邮件
messagehelper.setText("<html><head></head><body>Hello World ! </body></html>",true);
} catch (MessagingException e) {e.printStackTrace();}
//发送邮件
senderimpl.send(mimeMessage);
System.out.println("Send success.....");
}
}
根据代码清单2我们可看到只需要简单的设置
messagehelper.setText("<html><head></head><body>
Hello World ! </body></html>",true);第二个参数为true就可以发送HTML格式的邮件。
3)发送含有附件和内嵌文件的邮件
代码清单3
import java.io.IOException;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
public class SendMail {
public static void main(String args[]) throws MessagingException,
IOException {
JavaMailSenderImpl senderimpl = new JavaMailSenderImpl();
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");
senderimpl.setJavaMailProperties(properties);
// 设定mail server
senderimpl.setHost("smtpcom.263xmail.com");
// 设置用户名和密码
senderimpl.setUsername("*****@crimsonlogictj.com");
senderimpl.setPassword("*****");
// 建立邮件消息
MimeMessage mimeMessage = senderimpl.createMimeMessage();
MimeMessageHelper messagehelper =
new MimeMessageHelper(mimeMessage, true, "UTF-8");
// 设置寄件人
messagehelper.setFrom("*****@crimsonlogictj.com");
// 设置收件人
messagehelper.setTo("*****@crimsonlogictj.com");
// 设置邮件主题
messagehelper.setSubject("Test HTML");
// true 表示启动html格式的邮件
messagehelper.setText(
"<html><head></head><body>" +
"<img src=/"cid:img1/"></img>" +
//在HTML文本中嵌入了一个名为 cid:img1 的图片
"<h1>Hello World</h1></body></html>",
true);
//定义图片
ClassPathResource img = new ClassPathResource("01.jpg");
//定义附件1
ClassPathResource file2 = new ClassPathResource("02.jpg");
//定义附件2
ClassPathResource file3 = new ClassPathResource("03.jpg");
//将图片加入
messagehelper.addInline("img1", img.getFile());
//将附件1加入
messagehelper.addAttachment(file2.getFile().getName(),
file2.getFile());
//将附件2加入
messagehelper.addAttachment(file3.getFile().getName(),
file3.getFile());
// 发送邮件
senderimpl.send(mimeMessage);
System.out.println("Send success.....");
}
}