package com.ycsoft.report.query.task;
import java.util.Calendar;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.commons.helper.DateHelper;
import com.ycsoft.commons.helper.LoggerHelper;
import com.ycsoft.report.bean.RepTask;
import com.ycsoft.report.component.query.QueryComponent;
public class TaskExec extends Thread {
private QueryComponent queryComponent;
public TaskExec(QueryComponent queryComponent){
this.queryComponent=queryComponent;
}
private int task_max=1000;
public void exec(){
try {
//清理3天前的一次性任务
for(RepTask task:queryComponent.queryTaskTypeIsOne(3)){
queryComponent.deleteRepTask(task.getTask_id());
}
RepTask task=null;
int i=0;
task_max=queryComponent.queryAllRepTask().size();
while((task=queryComponent.queryCanExecTask())!=null){
i++;
if(i>task_max) {
LoggerHelper.error(this.getClass(), "报表计划任务异常,达到任务数量上限退出!");
return;
}
queryComponent.execTask(task);
}
} catch (ReportException e) {
LoggerHelper.error(this.getClass(), "报表计划任务异常退出!",e);
}
}
/**
* 上午六点半时间
* @return
*/
private long getCalendar(int day,int hour,int minute){
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, day);
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
System.out.println(DateHelper.format(c.getTime()));
return c.getTimeInMillis();
}
public void run(){
//每天早上6点半到下午3点之间执行任务
try{
while(true){
long todaynow=System.currentTimeMillis();
long today630=this.getCalendar(0,6,30);
long today1500=this.getCalendar(0,15,0);
long nextday630=this.getCalendar(1, 6, 30);
if(todaynow<today630){
this.sleep(today630-todaynow);
}else if(todaynow>today1500){
this.sleep(nextday630-todaynow);
}else{
this.exec();
this.sleep(nextday630-System.currentTimeMillis());
}
}
}catch(Exception e){
LoggerHelper.error(this.getClass(), "报表任务异常退出",e);
}
}
}