SPRING 定时器应用,使用定时器发送邮件

Spring 的强大又体现出来了,相较于 JDK 定时器来说 SPRING 定时器可以做的更多更好,使用起来也相对复杂,今天就为大家带来一个简易版的定时器,并且使用他实现定时邮件发送功能。

具体详细的功能和简介这里就不多说了,直接带大家做一遍:

一段可运行的代码比说很多废话强得多

S1:编写定时任务类(继承 QuartzJobBean )

    TIP:其中 Constant.getPath 是获得项目文件系统绝对路径,这部分已经在项目启动时配置到单例当中了,下面会给个简单实现。至于  JavaMailSenderImpl mailSender 请大家参考我上一篇博文。

/**
 ******************************************************************************************** 
 * @ClassName: SendEmailTimer
 * @Description: 定时发送邮件类,定时发送指定路径下的 PDF
 * @author ZhouQian
 * @date 2014-6-12-上午9:44:39
 ******************************************************************************************** 
 */
public class SendEmailTimer extends QuartzJobBean {
	private JavaMailSenderImpl mailSender;

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		try {

			// 任务执行时间
			Date fireTime = context.getFireTime();
			// 任务下次执行时间
			Date nextFireTime = context.getNextFireTime();

			String logContent = "此次运行时间:" + fireTime + ",下次运行时间:" + nextFireTime;
			System.out.println(logContent);

			// 发送邮件
			// 邮件POJO 对象
			MailPojo mailPojo = new MailPojo();
			MimeMessage m = mailSender.createMimeMessage();

			// 构造附件
			String path = "jsp/theme/analyser/hero.html";
			path = Constant.get_REALPATH() + path;
			File[] attachment = new File[1];
			String[] attachmentFileName = new String[1];
			attachment[0] = new File(path);
			attachmentFileName[0] = "hero.html";

			try {
				MimeMessageHelper helper = new MimeMessageHelper(m, true, "UTF-8");
				// 设置收件人
				helper.setTo("[email protected]");
				// 设置抄送
				// helper.setCc("");
				// 设置发件人
				helper.setFrom("[email protected]");
				// 设置暗送
				// helper.setBcc("");
				// 设置主题
				helper.setSubject("测试邮件!");
				// 设置 HTML 内容
				helper.setText("这只是一封测试邮件!如果你收到的话说明我已经发送成功了!");

				// 保存附件,这里做一个 copy 只是为了防止上传文件丢失
				attachment = saveFiles(attachment, attachmentFileName);
				for (int i = 0; attachment != null && i < attachment.length; i++) {
					File file = attachment[i];
					// 附件源
					FileSystemResource resource = new FileSystemResource(file);
					helper.addAttachment(attachmentFileName[i], resource);

					// mail 对象填充
					AttachmentPojo attachmentPojo = new AttachmentPojo();
					attachmentPojo.setFilename(attachmentFileName[i]);
					attachmentPojo.setFilepath(file.getAbsolutePath());
					mailPojo.getAttachmentPojos().add(attachmentPojo);
				}

				// 进行邮件发送和邮件持久类的状态设定z
				mailSender.send(m);
				mailPojo.setSent(true);
				System.out.println("邮件发送成功!");

			} catch (Exception e) {
				e.printStackTrace();
				mailPojo.setSent(false);
				// TODO: handle exception
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * struts 2 会将文件自动上传到临时文件夹中,Action运行完毕后临时文件会被自动删除 因此需要将文件复制到 /upload 文件夹下
	 * 
	 * @param files
	 * @param names
	 * @return
	 */
	public File[] saveFiles(File[] files, String[] names) {
		if (files == null)
			return null;
		File root = new File(Constant.get_REALPATH() + Constant.getFolderName());
		File[] destinies = new File[files.length];
		for (int i = 0; i < files.length; i++) {
			File file = files[i];
			File destiny = new File(root, names[i]);
			destinies[i] = destiny;
			copyFile(file, destiny);
		}
		return destinies;
	}

	/**
	 * 复制单个文件
	 * 
	 * @param from
	 * @param to
	 */
	public void copyFile(File from, File to) {
		InputStream ins = null;
		OutputStream ous = null;
		try {
			// 创建所有上级文件夹
			to.getParentFile().mkdirs();
			ins = new FileInputStream(from);
			ous = new FileOutputStream(to);
			byte[] b = new byte[1024];
			int len;
			while ((len = ins.read(b)) != -1) {
				ous.write(b, 0, len);
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (ous != null)
				try {
					ous.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			if (ins != null)
				try {
					ins.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
		}
	}

	public JavaMailSenderImpl getMailSender() {
		return mailSender;
	}

	public void setMailSender(JavaMailSenderImpl mailSender) {
		this.mailSender = mailSender;
	}

}


S2:定时任务配置,配置 applicationContext.xml

    依次配置 邮件 sender -> 定时任务 bean -> 定时任务触发器 bean -> 定时任务工场 bean 

<!-- 配置邮件 senderbean -->
	<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="${mail.smtp.host}"></property>
		<property name="javaMailProperties" >
			<props>
				<prop key="mail.smtp.auth">${mail.smtp.auth}</prop> 
				<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>		
			</props>
		</property>
		<property name="username" value="${mail.smtp.username}"></property>
		<property name="password" value="${mail.smtp.password}"></property>
	</bean>
	
	<!-- 定时器任务 START -->
	<!-- 配置定时邮件任务,需要配置实现类、以及依赖的属性 -->
	<bean id="sendEmailTimer" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value>com.sesan.dc.common.timer.SendEmailTimer</value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key="mailSender">
					<ref bean="mailSender"/>
				</entry>
			</map>
		</property>
	</bean>
	
	<!-- 定时器触发器,配置定时器,以及触发时机 -->
	<bean id="timerTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="sendEmailTimer"></property>
		<property name="cronExpression">
			<!-- 秒 分 小时 日 月 周几 年,每 30 秒执行一次 -->
			<value>30 * * * * ?</value>
		</property>
	</bean>
	
	<!--  定时器工场,可以配置多个触发器 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="timerTrigger"/>
			</list>
		</property>
	</bean>
	<!-- 定时器任务 END -->


S3:配置完毕,启动项目就可以启动定时任务,定时发送邮件


上下文根配置(这里简单的使用 servlet 和 一个常量类 constant 来实现)

S1:编写 Constant 常量持久类,持有一些公关常量

public class Constant {
	// 配置文件路径
	public static final String _CONFIG_FILE = "/baseconfig.properties"; 
	
	// 项目路径,可以使用单例进行存放
	public static String _REALPATH = "";
	
	public static String getConfigFile() {
		return _CONFIG_FILE;
	}
	public static String get_REALPATH() {
		return _REALPATH;
	}
	public static void set_REALPATH(String _REALPATH) {
		Constant._REALPATH = _REALPATH;
	}
}


S2:编写 initServlet 来进行项目参数初始化 ....(lol 很土的办法)

/**
 * 初始化参数Servlet,服务器启动自动开始加载
 * @author zhouqian
 *
 */
public class InitialServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;

	@Override
	public void init() throws ServletException {
		super.init();
		System.out.println("开始intitServlet");
		String realPath = getServletContext().getRealPath("/");
		Constant.set_REALPATH(realPath);
	}
}


S3:web.xml 配置,在 web.xml 设置 InitialServlet 启动加载

  ...... 省略 100 字
  
  <servlet>
    <servlet-name>InitialServlet</servlet-name>
    <servlet-class>com.sesan.dc.servlet.InitialServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  
  ...... 省略 100 字


如上配置完毕后就可以进行定时邮件的发送了,如果定时任务是其他类型任务只需要修改定时任务类的内容就行了

至于 SPRING 触发器时间配置网络上有很多参考资料,这里不再赘述


如果大家有不明白的可以留言问我,一同进步

你可能感兴趣的:(spring定时器,QuartzJobBean,spring文根,spring定时邮件,javaweb定时器)