近期写一个古董藏品排名更新的模块,要实时对藏品的人气数值对其进行排名.
刚开始的时候。我以为只是页面的排名,但是。我觉得应该将排名数据先保存到数据库,然后每隔一段时间进行更新,这样页面的数据会统一.
然后。在做的时候。想到了使用java.util.TimerTask 定时做任务.
步骤如下:
第一步,写一个任务类;
public class PaiMingTask extends java.util.TimerTask{
static Logger logger = Logger.getLogger(Index.class.getName());
@Override
public void run() {
/**
* 做排名
*/
try{
List list_cpTypeList = Data.Query("SELECT TypesId FROM Antique_Types WHERE ParentTypesId=?",new Object[]{1});
System.out.println(list_cpTypeList.size()+"藏品类型个数 ");
//此处的SQL排名,出现的数据会有重复的
String sql="SELECT (SELECT COUNT(DISTINCT TouPiaoCount) FROM CangpinOfContest WHERE CBType=? AND JingSaiLevelId=? AND TouPiaoCount>a.TouPiaoCount)+1 AS paiming,"+
"CPCId,a.CBType FROM CangpinOfContest a WHERE CBType=? ORDER BY paiming";
Integer currentLevel = new ContestOfCurrentQishu().getCurrentQiShu();//Integer.parseInt(GetProperties.readValue("CurrentJinSaiLevelId"));
for(int count=0;count<list_cpTypeList.size();count++){
List list_count=(List)list_cpTypeList.get(count);
System.out.println("藏品类别:"+list_count.get(0).toString()+"进行排名");
List list_cpType=Data.Query(sql,new Object[]{list_count.get(0).toString(),currentLevel,list_count.get(0).toString()});//((List)(list_cpTypeList.get(0))).get(0).toString()
String sql_update="UPDATE CangPinOfContest SET BaiMing=? WHERE CPCId=?";
for(int i=0;i<list_cpType.size();i++){
List list_cpTypeObject=(List)list_cpType.get(i);
if(Data.Update(sql_update,new Object[]{list_cpTypeObject.get(0),list_cpTypeObject.get(1)})>0){
System.out.println(list_cpTypeObject.get(1)+":排名"+list_cpTypeObject.get(0));
}
}
}
}catch (Exception e) {
logger.debug(e.toString());
try {
throw e;
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
然后,第二步:管理类
先写一个接口类
public interface DoPlanImpl {
public void DoPlan();
}
public class PaiMingManager implements DoPlanImpl{
static Logger logger = Logger.getLogger(PaiMingManager.class.getName());
Timer t = null;
public PaiMingManager(){
}
public void time(int day,int hour,int min,int sec){
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH,day);
c.set(Calendar.HOUR_OF_DAY,hour);
c.set(Calendar.MINUTE,min);
c.set(Calendar.SECOND,sec);
Date date = c.getTime();
System.out.println(c.getTime());
t= new Timer();
PaiMingTask mt = new PaiMingTask();
t.schedule(mt,date);
}
public void destoryTimer(){
t.cancel();
}
public void DoPlan() {
t= new Timer();
//任务类
PaiMingTask mt = new PaiMingTask();
t.schedule(mt, Calendar.getInstance ().getTime(), 15 * 1000);
}
}
第三步:写一个侦听
public class ContestPaiMing extends HttpServlet implements ServletContextListener{
static Logger logger = Logger.getLogger(ContestPaiMing.class.getName());
private DoPlanImpl doPlanImpl;
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("我的侦听结束");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
super.service(arg0, arg1);
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("我的侦听开始");
/**
* 视频处理
*/
// doPlanImpl=new TransCodeVideoManager();
// doPlanImpl.DoPlan();
/**
* 排名处理
*/
doPlanImpl=new PaiMingManager();
doPlanImpl.DoPlan();
}
}
额。重启服务器.