使用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>
现在就可以在你指定的时间执行你指定的任务.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值