【转载】使用JAVA在TOMCAT下实现计划任务监听器

package cn.softjob.util;

import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class AuthorSendMmailListener implements ServletContextListener {
	private Timer iTimer = null;
	private Task myTask = null;

	public void contextDestroyed(ServletContextEvent event) {
		// 在这里关闭监听器,所以在这里销毁定时器。
		iTimer.cancel();
		event.getServletContext().log("定时器已经销毁!");
	}

	public void contextInitialized(ServletContextEvent event) {
		// 在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
		event.getServletContext().log("定时器已经启动!");
		iTimer = new Timer(true);
		myTask = new Task();
		try {
			myTask.setScontext(event.getServletContext());
			// 设置任务计划,启动和间隔时间(每隔24(24*60*60*1000)小时触发一次,即凌晨0点)
			// 调用myTask,0表示任务无延迟
			iTimer.schedule(myTask, 0, 24 * 60 * 60 * 1000);
		} catch (Exception e) {
			System.out.println("异常信息如下:" + e.getMessage());
			e.printStackTrace();
		}
	}
}
接下来可以编写自己的功能类,此类一定要extends定时器类中TimerTask
package cn.softjob.util;

import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import cn.softjob.ap.authoritymanage.business.DelMember;
import cn.softjob.ap.personalBookmark.business.DelHasPostsBusiness;
import cn.softjob.ap.postsmanage.business.PostsManageBusiness;

public class Task extends TimerTask {
	/** 晚上12点 也即0点* */
	private static final int C_SCHEDULE_HOUR = 0;
	/** 任务是否执行完或是否到达指定时间标志* */
	private static boolean isRunning = false;
	private ServletContext scontext = null;

	public Task() {
	}

	public void run() {
		Calendar cal = Calendar.getInstance();
		if (!isRunning) {
			// 判断是否等于指定运行的时间
			if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
				isRunning = true;
				this.scontext.log("开始执行指定任务!");
				try {
					// 自动删除到期(超过30天的收藏职位)的收藏职位信息
					new DelHasPostsBusiness().DelHasPosts();
					// 清理超过30天未审核的企业用户
					new DelMember().delUnExamineMember();
					// 企业会员付费会员类型结束时,停止付费会员期间发布的职位
					new PostsManageBusiness().stopPosts();
					// 获取待发送邮件的email地址
					String[] address = new AuthorSendMail().getUserEmail();
					// 当没有符合条件的记录时,不进行发送邮件的操作
					if (address != null && !"".equals(address)
							&& address.length != 0) {
						String[] meru = new String[] { "51SoftJob人才招聘网温馨提醒",
								"亲爱的用户:您好!您的简历在已经30天没有更新过了,为了给你带来更多更好好的就业机会,请您尽快更新您的简历!" };
						MailManager mail = new MailManager();
						mail.sendMail("", address, meru[0], meru[1],
								"text/plain");
						scontext.log("已经成功的向注册会员发送简历!");
					} else {
						scontext.log("没有符合发送条件的记录!");
					}
					// 执行计划结束
					isRunning = false;
				} catch (Exception e) {
					e.printStackTrace();
					scontext.log("上一次任务执行还未结束");
				}
				scontext.log("指定任务执行结束!");
			} else {
				scontext.log("上一次任务执行还未结束");
			}
		}
	}

	/**
	 * 设置ServletContext对象
	 * 
	 * @param scontext
	 *            返回一个ServletContext对象
	 */
	public void setScontext(ServletContext scontext) {
		this.scontext = scontext;
	}
}

Servlet侦听器结合Java定时器实现任务计划调度
下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。
    我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):
public void contextDestroyed(ServletContextEvent event) {
iTimer.cancel();
event.getServletContext().log("定时器已经销毁!");
}
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().log("定时器已经启动!");
iTimer = new Timer(true);
myTask = new Task();
try {
myTask.setScontext(event.getServletContext());
//设置任务计划,启动和间隔时间(每隔24(24*60*60*1000)小时触发一次,即凌晨0点)
iTimer.schedule(myTask, 0, 24*60*60*1000) ;
} catch (Exception e) {
   System.out.println("异常信息如下:" + e.getMessage());
   e.printStackTrace();
}
以上代码中, iTimer.schedule(myTask, 0, 24*60*60*1000) 这一行为定时器调度语句,其中myTask是自定义需要被调度的执行任务(在此项目中,实现向符合条件的用户自动发送邮件),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每天晚上0点(即24*60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单,不再详细说明。
   下面介绍Task的实现,上面的代码中看到了在构造Task后,先设置javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入。在timer.schedule()的调度中,设置了每24小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
// 判断是否等于指定运行的时间
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
this.scontext.log("开始执行指定任务!");
try {
// 自动删除到期(超过30天的收藏职位)的收藏职位信息
new DelHasPostsBusiness().DelHasPosts();
//清理超过30天未审核的企业用户
new DelMember().delUnExamineMember();
//企业会员付费会员类型结束时,停止付费会员期间发布的职位
new PostsManageBusiness().stopPosts();
// 获取待发送邮件的email地址
String[] address = new AuthorSendMail().getUserEmail();
// 当没有符合条件的记录时,不进行发送邮件的操作
if (address != null && !"".equals(address)
&& address.length != 0) {
String[] meru = new String[] { "51SoftJob人才招聘网温馨提醒",
"亲爱的用户:您好!您的简历在已经30天没有更新过了,为了给你带来更多更好好的就业机会,请您尽快更新您的简历!" };
MailManager mail = new MailManager();
mail.sendMail("",address, meru[0], meru[1] ,"text/plain");
scontext.log("已经成功的向注册会员发送简历!");
} else {
scontext.log("没有符合发送条件的记录!");
}
//执行计划结束
isRunning = false ;
} catch (Exception e) {
e.printStackTrace();
scontext.log("上一次任务执行还未结束");
scontext.log("指定任务执行结束!");
} else {
scontext.log("上一次任务执行还未结束");
}
}
}
ServletContextListener和Task的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:
<!-- 自动发送邮件监听器 -->
<listener>
     <listener-class>
cn.softjob.util.AuthorSendMmailListener
     </listener-class>
</listener>
现在就可以在你指定的时间执行你指定的任务.

转载:http://blog.csdn.net/rongdajian/article/details/3296772

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值