JAVA中每隔15秒更新字段数值排名

近期写一个古董藏品排名更新的模块,要实时对藏品的人气数值对其进行排名.

刚开始的时候。我以为只是页面的排名,但是。我觉得应该将排名数据先保存到数据库,然后每隔一段时间进行更新,这样页面的数据会统一.

然后。在做的时候。想到了使用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();
    }

}

额。重启服务器.

ACM/ICPC比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。 解题数量很容易计算,只需考察比赛标记为“Accepted”的题数即可。罚时计算则相对复杂,对于提交到竞赛系统的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之前的每次提交,都有20分钟的罚时,但如果该题目最终未解出,则不计罚时。 先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。 示例输入: 2008-04-25 18:00:00 2008-04-25 23:30:00 1000 1001 1002 1003 1004 38 602203621 1002 Accepted 756K 30MS C++ 2008-04-25 18:04:59 37 liheyuan 1002 Wrong_Answer 768K 10MS C++ 2008-04-25 18:28:05 36 ftest 1000 Accepted 888K 10MS C++ 2008-04-25 21:30:32 35 ftest 1000 Accepted 904K 10MS C++ 2008-04-25 21:30:55 34 gaojianwei 1000 Accepted 768K 10MS C 2008-04-25 22:15:58 33 gaojianwei 1001 Wrong_Answer 904K 10MS C 2008-04-25 22:18:01 32 gaojianwei 1004 Accepted 768K 10MS C 2008-04-25 22:24:23 31 lzz 1000 Accepted 904K 10MS C++ 2008-04-25 23:29:27 30 lzz 1001 Wrong_Answer 904K 10MS C++ 2008-04-25 23:30:17 示例输出: Rank Name Solved 1000 1001 1002 1003 1004 Penalty 1 gaojianwei 2 4:15:58 -1 0 0 4:24:23 8:40:21 2 602203621 1 0 0 0:04:59 0 0 0:04:59 3 ftest 1 3:30:32 0 0 0 0 3:30:32 4 lzz 1 5:29:27 0 0 0 0 5:29:27 5 liheyuan 0 0 0 -1 0 0 0:00:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值