`

Java定时器使用

    博客分类:
  • java
 
阅读更多

Java定时器在项目中的使用

项目中有个自动发送邮件的功能,这里结合监听器一起使用。

/**
 * 
 */
package com.bettersoft.netbank.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi2.hssf.usermodel.HSSFCell;
import org.apache.poi2.hssf.usermodel.HSSFRow;
import org.apache.poi2.hssf.usermodel.HSSFSheet;
import org.apache.poi2.hssf.usermodel.HSSFWorkbook;

import com.bettersoft.admin.BtInit;
import com.bettersoft.admin.UserManager;
import com.bettersoft.admin.bean.CreateBankDealBillBean;
import com.bettersoft.admin.dao.CreateBankDealBillDao;
import com.bettersoft.admin.mail.MailSenderInfo;
import com.bettersoft.admin.mail.SimpleMailSender;
import com.bettersoft.netbank.bean.QueryMoneyDate;
import com.bettersoft.util.DBManager;
import com.bettersoft.util.HSSFExcelUtil;

public class SendEmailServletListener implements ServletContextListener {
	Log log = LogFactory.getLog(SendEmailServletListener.class);
	Timer time = new Timer(true);
	public static String fileNameStaic;

	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		log.info("自动发送邮件开始停止任务......");
		time.cancel();
		log.info("自动发送邮件任务已经停止!");
	}

	public void contextInitialized(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		ServletContext context = arg0.getServletContext();
		String fileName = context.getRealPath("");
		System.out.println("file" + context.getRealPath(""));
		String isStart = context.getInitParameter("isSendEmailStart");
		log.info("自动发送银行处理结果邮件=" + isStart);
		// 如果为true则启动此任务
		if ("true".equals(isStart)) {
			// 每次任务运行时间间隔,单位分钟
			String interval = context.getInitParameter("intervalEmail");
			// 任务运行时间段起始时间
			String start = context.getInitParameter("startTimeEmail");
			// 任务运行时间段结束时间
			String end = context.getInitParameter("endTimeEmail");
			if ("".equals(interval) || interval == null) {
				interval = "10";
			}
			if ("".equals(start) || start == null) {
				start = "06:00:00";
			}
			if ("".equals(end) || end == null) {
				end = "18:00:00";
			}
			// int intervalTime= Integer.parseInt(interval);
			long intervalTime = Long.parseLong(interval);// 换成long。BY:wanglh,DATE:2011-3-25

			time.schedule(new SendEmailInterfaceTask(start, end, context),
					60000, intervalTime * 60 * 1000);
			// time.schedule(new ErpInterfaceTask(start,end) , 60000, 10000);
		}
		log.info("监听器初始化完成......");

	}

}

class SendEmailInterfaceTask extends TimerTask {
	Log log = LogFactory.getLog(SendEmailInterfaceTask.class);
	private String startTime;
	private String endTime;
	private String fileName;
	private ServletContext context;

	public SendEmailInterfaceTask(String startTime, String endTime,
			ServletContext context) {
		this.startTime = startTime;
		this.endTime = endTime;
		this.context = context;
	}

	public void run() {
		try {
			if (isOk()) {
				System.out.println("realPath:" + this.context.getRealPath(""));
				queryEmailFlag();
			} else {
				log.info("任务未到运行时间(" + startTime + "-----" + endTime + ")");
			}
		} catch (Exception ex) {
			log.info("发生异常此次任务终止!");
			ex.printStackTrace();
		}
	}

	// 判断是否是时候启动任务
	public boolean isOk() throws Exception {
		boolean flag = false;
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			String currentTime;
			// java类获取的当前时间有时候不正确,所以从数据库取当前时间
			con = DBManager.getConnection();
			int dbType = DBManager.getDBType(con);
			String sql = "";
			switch (dbType) {
			case 1:

				break;
			case 2:
				// Oracle
				sql = "select sysdate from dual";
				break;
			case 3:
				// DB2
				sql = "values current timestamp";
				break;
			default:
				break;
			}
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			rs.next();
			currentTime = rs.getString(1);
			log.info("当前时间:" + currentTime);
			Timestamp start = Timestamp.valueOf(currentTime.substring(0, 11)
					+ this.startTime);
			Timestamp end = Timestamp.valueOf(currentTime.substring(0, 11)
					+ this.endTime);
			Timestamp now = Timestamp.valueOf(currentTime);
			if (start.compareTo(now) <= 0 && end.compareTo(now) >= 0) {
				flag = true;
			}
		} finally {
			if (rs != null) {
				rs.close();
			}
			if (ps != null) {
				ps.close();
			}
			if (con != null) {
				con.close();
			}
		}
		return flag;
	}

	public void queryEmailFlag() {
		try {
			CreateBankDealBillDao dao = new CreateBankDealBillDao();
			List v = dao.getMoneyDateExcel();
			List listUser = dao.getUser();
			if (listUser == null || listUser.size() < 1) {
				return;
			}
			String fileName = saveExcel(v);
			CreateBankDealBillBean bean = null;
			for (int i = 0; i < listUser.size(); i++) {
				bean = (CreateBankDealBillBean) listUser.get(i);
				if (!StringUtil.isEmpty(bean.getEmail())) {
					MailSenderInfo mailInfo = null;
					SimpleMailSender sms = new SimpleMailSender();
					mailInfo = new MailSenderInfo();
					log.info("自动发送银行处理邮件任务启动..........");
					UserManager userManager = new UserManager();
					mailInfo.setMailServerHost(BtInit.getMail_server_host());
					mailInfo.setMailServerPort(BtInit.getMail_server_port());
					mailInfo.setValidate(true);
					mailInfo.setUserName(BtInit.getMail_user_name());
					mailInfo.setPassword(BtInit.getMail_user_pwd());
					mailInfo.setFromAddress(BtInit.getMail_user_name());
					// mailInfo.setToAddress(BtInit.getMail_to_address());
					mailInfo.setToAddress("puzhangsz@126.com");
					mailInfo.setSubject(com.bettersoft.util.Bootstrap.td_flag
							+ "银企互联系统邮件");
					mailInfo.setContent("领导,您好!"
							+ com.bettersoft.util.Bootstrap.td_flag
							+ "银企互联系统提醒您:根据自动发送银行处理结果邮件设置,本次银行处理结果请见附表。");
					sms.sendHtmlMail(mailInfo, fileName);
					log.info("自动发送银行处理邮件任务结束....................");
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 发送邮件
	 */
	public String queryFile() {
		String fileName = "";
		try {
			// System.out.println("filePath22222"
			// + System.getProperty("user.dir").replaceAll("\\", "/"));
			// SendEmailInterfaceTask.class.getResource("").getPath()
			// .replaceAll("%20", " ")
			// request.getSession().getServletContext().getRealPath("");
			// String filePath =
			System.out.println("filePath3333333"
					+ this.getClass().getResource("/").getPath());
			String filePath = SendEmailServletListener.fileNameStaic;
			System.out.println("filePath" + filePath);
			File file = new File(filePath);
			if (file.isDirectory()) {
				File f = new File(filePath + "银行执行情况报表.xls");
				if (!f.exists()) {
					f.createNewFile();
					fileName = filePath + "银行执行情况报表.xls";
				} else {
					// 文件删除之后再新建一个新的文件
					f.delete();
					f.createNewFile();
					fileName = filePath + "银行执行情况报表.xls";
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return fileName;
}

 需要在web.xml配置监听器

<listener>
		<!-- -->
		<listener-class>com.bettersoft.netbank.util.SendEmailServletListener</listener-class>
	</listener>
	<context-param>
		<!--是否启动ERP接口回传任务: true 启动,false 不启动-->
		<param-name>isSendEmailStart</param-name>
		<param-value>true</param-value>
	</context-param>
	
	<context-param>
		<!--动ERP接口回传任务扫描间隔,分钟为单位-->
		<param-name>intervalEmail</param-name>
		<param-value>5</param-value>
	</context-param>
	
	<context-param>
		<!--每天开始启动时间,格式:hh:mi:ss(06:00:00)-->
		<param-name>startTimeEmail</param-name>
		<param-value>06:00:00</param-value>
	</context-param>
	<context-param>
		<!--每天运行结束时间,格式:hh:mi:ss(06:00:00)-->
		<param-name>endTimeEmail</param-name>
		<param-value>22:00:00</param-value>
	</context-param>

 

 

 

分享到:
评论

相关推荐

    JAVA中定时器的使用

    JAVA中定时器的使用 JAVA 中的定时器是指在特定的时间或时间间隔执行某个任务的机制。JAVA 中提供了多种方式来实现定时器,包括使用 Timer 和 TimerTask 类,使用 ScheduledExecutorService 等。 在 JAVA 中,...

    java定时器使用汇总.pdf

    Java定时器(Timer)是Java.util包中的一个类,它提供了调度任务的能力,可以在未来的某个时间点或定期执行任务。这个功能在很多场景下都非常有用,例如数据同步、监控、清理过期数据等。在Web应用中,定时器通常会...

    Java定时器的使用 Java程序

    本篇文章将深入探讨Java定时器的使用方法和关键概念。 ### 1. Java定时器类介绍 Java定时器类`Timer`和`TimerTask`是配合使用的。`Timer`用于创建定时器实例并调度任务,而`TimerTask`则是一个抽象类,用于定义要...

    JAVA定时器JAVA定时器.pdf

    在使用JAVA定时器时,需要注意以下几点: * 在中不能够设置default-lazy-init="true",否则定时任务不触发。 * 在中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory....

    Java定时器

    Java定时器是Java编程语言中用于执行特定任务的调度工具,它允许程序员在指定的时间间隔后执行特定的代码块或任务。在Java中,我们主要使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时器功能。这两个类...

    java定时器的使用

    在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。 对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。

    java的定时器使用方法.txt

    ### Java定时器使用详解 #### 一、定时器(Timer)概述 在Java语言中,`Timer`类位于`java.util`包内,主要用于管理基于时间的事件。它能够安排某些任务在未来某个时间点或者按照一定的周期性重复执行。为了使用`...

    java 定时器(Timer)

    Java定时器(Timer)是Java Swing库中的一个类,它提供了调度任务在未来某个时间执行的能力。这个类主要用于在GUI应用程序中实现定时触发某些操作,比如更新界面、执行动画或者执行周期性的后台任务。Timer类结合了...

    java定时器

    java定时器,import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; 规定每天几点执行一次

    java定时器设置及停止的方法

    在Java编程中,定时任务是不可或缺的一部分,它们用于执行周期性操作,如数据备份、监控、清理等。本文将深入探讨如何在Java中设置和停止定时任务,主要关注`java.util.Timer`和`java.util.TimerTask`,以及更现代的...

    java 定时器 spring 定时器

    Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...

    Java定时器框架(Quartz)

    Java定时器框架Quartz是Java开发中用于任务调度的一个强大工具,它允许开发者精确地控制任务的执行时间,包括一次性任务和周期性任务。Quartz以其灵活性和稳定性,在企业级应用中广泛使用,尤其在需要定期执行后台...

    java定时器服务!!

    Java定时器服务是Java平台中用于执行定时任务的关键组件,它允许开发者安排未来或定期的任务执行。在Java中,我们通常使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时服务。这两个类提供了创建、调度和...

    java定时器(timer类使用详解)

    Java定时器,也被称为`Timer`类,是Java标准库中的一个强大工具,它允许开发者在指定的时间间隔执行任务,从而实现定时操作。这个类在`java.util`包中定义,是实现定时任务调度的核心。在本文中,我们将深入探讨`...

    JAVA定时器JAVA定时器

    JAVA定时器,只要服务开启,就能指定某些代码在某个时刻执行,例如:监狱里罪犯的余刑天数,每天都要减少,就可以设置一个定时器在每天的23:59:59来执行减少余刑天数的天。

    简单易用的java定时器scheduler,有完整配置说明

    在使用Java定时器时,我们需要注意以下几点: 1. **线程安全**:如果定时任务涉及到共享资源,确保任务代码是线程安全的,避免并发问题。 2. **异常处理**:定时任务可能会抛出异常,需要正确捕获并处理,防止任务...

    java定时器.rar

    这个“java定时器.rar”压缩包可能包含了关于如何使用Java定时器的相关示例代码和教程。 Java定时器类库主要由两个核心类组成:`Timer`和`TimerTask`。`Timer`类是定时器本身,负责调度任务;而`TimerTask`是实现了...

    Java定时器简例

    ### Java定时器实现详解 在Java编程中,定时任务是常见的需求之一,无论是服务器的定期维护、数据同步,还是客户端的动画更新等场景,都需要用到定时器来精确控制任务的执行时间。本文将深入解析一个基于Java的简单...

Global site tag (gtag.js) - Google Analytics