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>