`

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>

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics