之前就经历过使用定时器的问题,我见过的有两种方式可以实现。
具体方法可以看看这篇博文:Java 中实现定时服务 在ssh框架中跟普通工程里面创建的方式
我这里使用的是SSH1框架给大家说的就是那篇博文里面的第二种方式。
里面有涉及到很多细节问题,也是我之前"百度"and "Google" 的问题,待会儿一并标出。
首先创建一个普通类A extends java.util.TimerTask
private static boolean isRunning = false;
@Override
public void run() {
// TODO Auto-generated method stub
if (!isRunning) {
isRunning = true;
try {
//这里调用你要执行的方法
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
isRunning = false;
}
}
}
//在这个类A中可以有一个带参数的构造方法QNE_OrderService qneOrderService这些对象都是通过下面定时器传过来的
public QnrAutoTicketThreadManagerTimesTask(QNE_OrderService qneOrderService) {
this.qneOrderService=qneOrderService;
}
说到定时器接着就创建一个Java类B实现一个ServletContextListener接口,这里就必须实现两个抽象方法了
contextInitialized:在Web应用启动时初始化任务
contextDestroyed:在Web应用结束时停止任务
大家应该注意到contextInitialized方法里面有个参数ServletContextEvent sce 就是这个参数就是我们一直苦苦寻求的在普通方法里面怎么得到request或session对象(为什么要得到这些呢?)。是想得到一些作用域里面的对象或值
ServletContext servletContext=sce.getServletContext(); // 这个很关键 得到ServletContext
看下面一段代码:
ApplicationContext app = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
QNE_OrderService qneOrderService = (QNE_OrderService)app.getBean("qneOrderService"); //得到spring里面的bean对象 (业务接口实现类)
//下面就可以得到你想要的了
timer.schedule(new A(qneOrderService),NO_DELAY,1000*AutoIssueTimeLongs);// 创建定时器
public static Timer createTimer(ServletContext servletContext){
timer=new Timer(true);
servletContext.setAttribute("timer", timer); // 放到这里里面是保证一个应用里面只创建唯一一个 “timer”定时器对象 (当然可以在创建别的定时器)方便下次再刷新对象参数
return timer;
}
最后一步就是一个web.xml监听器配置了。
在WEB.XML中加上下面这段代码就会在服务器的时候就开启定时器了(如果需要在前台对这个定时器进行控制的话就需要再考虑了,启动了要怎么再设置多长时间启动一次?等这些问题)
<!-- 定时服务监听器 -->
<listener>
<listener-class>com.sxy.tasks.TimerManager</listener-class>
</listener>