- 论坛徽章:
- 0
|
package cn.yicha.timer;
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import org.apache.log4j.Logger;
import cn.yicha.ask.AskBaidu.AskBaidu_Inti;import cn.yicha.common.*;//import jp.yicha.video.action.IndexAction;
public class MainTimerListener implements ServletContextListener { //public static final Logger logger = Logger.getLogger(MainTimerListener.class.getName()); private static Logger logger = Logger.getLogger(MainTimerListener.class); private Timer timer = null;
public void contextInitialized(ServletContextEvent event) { try{ // 在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能 Const.load(); int startHour = Integer.parseInt(Const.TimerStart); int periodHour = Integer.parseInt(Const.TimerPeriod); //renyy add method AskBaidu_Inti.askinit(); //renyy add method Calendar c = Calendar.getInstance(); c.add(Calendar.DATE,1); c.set(Calendar.HOUR_OF_DAY,startHour); c.set(Calendar.MINUTE,0); c.set(Calendar.SECOND,0); c.set(Calendar.MILLISECOND,0); Date start = c.getTime();
// long delay = start.getTime() - System.currentTimeMillis();//tomcat启动后间隔1000毫秒启动 long period = periodHour * 60 * 60 * 1000; //间隔 //long period = 10000;// long period = 1000*60*10; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); timer = new Timer(true); logger.info("Listener Start--> Time:"+sdf.format(new Date())); System.out.println("开始时间:"+start+"间隔时间:"+period); Calendar cal = Calendar.getInstance(); Date t = cal.getTime(); if(cal.get(Calendar.HOUR_OF_DAY) > 5){ cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); t = new Date(cal.getTimeInMillis()+24*60*60*1000L); } else{ cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); t = cal.getTime(); } timer.schedule(new MainTask(), t, 24*60*60*1000L);// 调用MainTask timer.schedule(new AskBaiduTask(), new Date(), 60*1000L); //debug //timer.schedule(new MainTask(), 1*60*1000, 1*60*1000);// 调用MainTask logger.info("Listener End--> Time:"+sdf.format(new Date())); }catch(Exception e){ logger.error("Listener Error+++++++++++++++++++++++++++++++++:", e); e.printStackTrace(); } }
public void contextDestroyed(ServletContextEvent event) {//在这里关闭监听器,所以在这里销毁定时器。 //renyy add method AskBaidu_Inti.saveQueue(); //renyy add method timer.cancel(); logger.info("Listener destroy!"); }}
package cn.yicha.timer;
import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.ResultSet;import java.sql.SQLException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.TimerTask;
import org.apache.log4j.Logger;
import cn.yicha.ask.expert.Candidate;import cn.yicha.ask.user.Db;import cn.yicha.common.Const;
public class MainTask extends TimerTask { public static final Logger logger = Logger.getLogger(MainTask.class.getName());
private static boolean isRunning = false;//任务正在执行标志,以避免重复执行
public MainTask() { } /** * 自动评选专家 * @param db */ private void assessExpert(Db db) { backData(db); Candidate candidate = new Candidate(); candidate.update(); } /** * 备份专家表到XML文件 * @param db */ private void backData(Db db) { StringBuffer sql = new StringBuffer(); sql.append("SELECT e.id,e.user_id,e.nick_name,c.name,e.add_time,e.answer,e.best_answer,e.level,e.fast_answer ") .append(" FROM t_qa_expert AS e LEFT JOIN t_qa_question_category AS c ON e.cate_id=c.id " ) .append("WHERE e.state=0 ORDER BY e.cate_id ,e.answer DESC ,e.best_answer DESC "); ResultSet rs = db.executeQuery(sql.toString()); File backFile = getBackFile(); BufferedWriter output = null; try { output = new BufferedWriter(new FileWriter(backFile)); while(rs.next()){ StringBuffer readLine=new StringBuffer(); readLine.append( rs.getString(1)+"\t") .append(rs.getString(2)+"\t") .append(rs.getString(3)+"\t") .append(rs.getString(4)+"\t") .append(rs.getString(5)+"\t") .append(rs.getString(6)+"\t") .append(rs.getString(7)+"\t") .append(rs.getString(8)+"\t") .append(rs.getString(9)+"\t\n"); output.write(readLine.toString()); } output.close(); } catch (IOException e1) { e1.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(output != null){ output.close(); } } catch (IOException e) { e.printStackTrace(); } } }
private File getBackFile() { Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); return new File(Const.ExpertBackFilePath+"ExpertBackFile"+year+month+".txt"); }
public void run() { //Calendar c = Calendar.getInstance(); //System.out.println("123456789"); try{ if (!isRunning) { isRunning = true; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Task start-->Time:"+sdf.format(new Date())); logger.info("Task start-->Time:"+sdf.format(new Date())); String start = getStartOfMonth(); String end = getEndOfMonth(); logger.info("Task start-->Time:" + start + " end:" + end); Db db=Db.getSelf(); if(isOneDay()){ assessExpert(db); } String sql=""; sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.verify='10' and answer_time between '2008-11-01 00:00:00' and '2009-01-31 11:59:59' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set answer=ee.sum1"; sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set answer=ee.sum1"; db.executeUpdate(sql); sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=1 and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set answer=ee.sum1"; db.executeUpdate(sql); sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.is_best='1' and b.verify='10' and answer_time between '2008-11-01 00:00:00' and '2009-01-31 11:59:59' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set best_answer=ee.sum1"; sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.is_best='1' and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set best_answer=ee.sum1"; db.executeUpdate(sql); sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=1 and b.is_best='1' and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set best_answer=ee.sum1"; db.executeUpdate(sql); /* * 五分中内回答数 */ sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.isfast='1' and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set fast_answer=ee.sum1"; db.executeUpdate(sql); sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=1 and b.isfast='1' and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set fast_answer=ee.sum1"; db.executeUpdate(sql); /* * 专家团统计更新 */ sql="UPDATE t_qa_expert_group d LEFT JOIN " +" (SELECT pid AS cate_id,CAST(SUM(IF(fastNum IS NULL,0,fastNum))/SUM(IF(allNum IS NULL ,0,allNum))*100 AS DECIMAL(4,2)) AS quick_percent FROM " +" (SELECT category ,COUNT(*) AS allNum FROM t_qa_question WHERE ask_time BETWEEN '" + start +"' and '" + end +"' GROUP BY category) a " +" LEFT JOIN " +" (SELECT category,COUNT(*) AS fastNum FROM t_qa_question WHERE ask_time BETWEEN '" + start +"' and '" + end +"' AND first_answer_time-ask_time +" ON a.category = b.category " +" LEFT JOIN " +" (SELECT id,IF(parent_id IS NULL ,id,parent_id) AS pid FROM t_qa_question_category) c " +" ON a.category =c.id " +" GROUP BY c.pid)e " +" ON d.cate_id=e.cate_id " +" SET d.up_down= IF((e.quick_percent-d.quick_percent)=0,0,IF((e.quick_percent-d.quick_percent)>0,1,-1)), " +" d.quick_percent = IF(e.quick_percent IS NULL ,0,e.quick_percent)"; db.executeUpdate(sql); db.close(); /* if (Const.VideoListDailySorterEnable.equals("true")){ TimesMap.setSortList(); } if (Const.AlbumSorterEnable.equals("true")){ AlbumUtil.initRecommendAlbum(); } if (Const.VideoIndexOptimizeAutorun.equals("true")){ (new OptIndexServlet()).optimizeIndex(); } */ AutoMature.JudgeMature(); AutoMature.updateVote(); isRunning = false; logger.info("Task end-->Time:"+sdf.format(new Date())); } else { logger.info("one Task is running"); } }catch(Exception e){ logger.error("Task error++++++++++++++++++++++"+e); e.printStackTrace(); } } /** * 获取上月的开始时间 * @return */ public static String getStartOfMonth(){ Calendar cal = Calendar.getInstance(); //cal.add(Calendar.MONTH, 0); cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH)); cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); return date2str(cal.getTime(), TODAY_STRING_DATE); } /** * 获取上月的结束时间 * @return */ public static String getEndOfMonth(){ Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); cal.add(Calendar.DAY_OF_MONTH, -1); return date2str(cal.getTime(), TODAY_STRING_DATE); } public final static String TODAY_STRING_DATE = "yyyy-MM-dd HH:mm:ss"; public static String date2str(final Date date, final String pattern) { //date to string SimpleDateFormat sf = new SimpleDateFormat(pattern); return sf.format(date); } /** * 判断是否是每月的1号 * @return */ public static boolean isOneDay(){ Calendar cal = Calendar.getInstance(); return cal.get(Calendar.DAY_OF_MONTH) ==1; } public static void main(String argv[]){ System.out.println(MainTask.isOneDay()); Db db=Db.getSelf(); MainTask mt = new MainTask(); mt.backData(db); /*System.out.println(getEndOfMonth()); System.out.println(getStartOfMonth()); String start = getStartOfMonth(); String end = getEndOfMonth(); String sql = null; sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set answer=ee.sum1"; System.out.println(sql); sql=" update t_qa_expert aa join (select a.id,count(*) sum1 from t_qa_expert a join t_qa_answer b on a.user_id=b.user_id where a.state=0 and b.is_best='1' and b.verify='10' and answer_time between '" + start +"' and '" + end +"' and b.question_id in (select c.question_id from t_qa_question c,t_qa_question_category d where c.category=d.id and (d.parent_id=a.cate_id or d.id=a.cate_id)) group by a.user_id,a.cate_id ) ee on aa.id=ee.id set best_answer=ee.sum1"; System.out.println(sql);*/ }}
package cn.yicha.timer;
import java.text.SimpleDateFormat;import java.util.Date;import java.util.TimerTask;
import org.apache.log4j.Logger;
import cn.yicha.ask.question.CheckAskBean;import cn.yicha.ask.user.Db;
public class AskBaiduTask extends TimerTask{ public static final Logger logger = Logger.getLogger(AskBaiduTask.class.getName());
private static boolean isRunning = false;//任务正在执行标志,以避免重复执行
@Override public void run() { // TODO Auto-generated method stub try{ if (!isRunning) { isRunning = true; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); logger.info("任义勇Task start-->Time:"+sdf.format(new Date())); CheckAskBean chb = new CheckAskBean(); chb.opration(); isRunning = false; logger.info("任义勇Task end-->Time:"+sdf.format(new Date())+isRunning); } else { logger.info("任义勇one Task is running"+isRunning); } }catch(Exception e){ logger.error("Task error++++++++++++++++++++++"+e); e.printStackTrace(); } }
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104127/showart_2079610.html |
|