Java定时器在JavaWeb中的整合启动

时间:2021-07-27 13:03:21
                    **javaweb项目启动时设置定时器并每隔固定时间执行对应代码**
javaweb项目中使用定时器可以定期清理缓存,也可以是定期执行部分代码片段。这个定时器在普通项目中我们很容器就实现了,因为它执行的是阻塞式的方法。
这里我们这样写:
package com.gps.app.listener;

import java.util.Timer;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.gps.app.timer.MyTask;

public class ContextListener implements ServletContextListener {

private Timer timer = null;

@Override
public void contextDestroyed(ServletContextEvent event) {
if(null!=timer)timer.close;
}

/**
* 这里是在web项目启动的时候执行的监听器执行的初始化方法。
*/

@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext();
timer = new Timer(true);
context.log("定时器启动了");
timer.schedule(new MyTask(event.getServletContext()), 0 , 5000);
context.log("定时器执行完一次");
}
}
在上述的监听器相关代码实现编码之后,我们就可以对我们的定时器进行code,让这宿主为ServeletContext的Timer有生命的价值。下面是我们的定时器部分的代码:

package com.gps.app.timer;

import java.util.List;
import java.util.TimerTask;

import javax.servlet.ServletContext;

import SocketServers.delData.SpringFactory;

import com.gps.entity.TxData;
import com.gps.service.TxDataService;

public class MyTask extends TimerTask {
/**
* 这块存在的主要目的是为了调用ServeletContext的log(“message”)方法
*/
private ServletContext servletContext;
/**
* tx设备表格相关的服务
*/
private static TxDataService txDataService;

public MyTask() {
super();
}

public MyTask(ServletContext servletContext) {
super();
this.servletContext = servletContext;
}

@Override
public void run() {
if(txDataService == null){
txDataService = SpringFactory.getBean("txDataService");
}
List<TxData> txDatas = txDataService.getTxDatasByImei("imei10001");
for(TxData txData:txDatas){
System.out.println(txData);
}
}

}

上面的springFactory是在项目启动时加载的一个工厂主要是获取没有加注解的service对象,所以这块的话我们使用它来完成对数据库的操作。具体实现方式参照:

spring启动时加载数据库中的数据

last but not least
我们最后一步关键的步骤是把上面的监听器配置到我们的web项目中去:

Java定时器在JavaWeb中的整合启动
项目挂载之后可以启动了。