我这么处理过,加个状态,正在运行就略过本次定时任务。
public class TestTimer extends TimerTask{
private boolean isRun = false;
private int icount = 0;//定时划分细一些(如10次才是真正的一个任务),略过后等待是接近完整的周期。不加这样的判断定时器触发时间是固定的;加上就是基本按上一次完成时来定间隔周期。
public void run() {
if(isRun) return;//正在运行,略过本次
if(++icount<10) return;//时间粒度是10
try {
icount = 0;
isRun = true;
runTask();
} catch (Exception e) {
e.printStackTrace();
}finally{
isRun = false;
}
}
private void runTask(){
//Task
}
}
我用的是quartz 这个定时器,我现在方法结束时 返回success 这样可以吗?
test.insert(sql1);
if(state.equals("SUCCESS")){
String time = "5";
realTime.startInsertGPS(time);
}else{
String time = "5+"+timeNum+"";
timeNum=timeNum+5;
realTime.startInsertGPS(time);
}
我是这样判断的 可以吗
我这样不行 虽然可以加大定时器的时间,但是没执行完的话,他一直调用定时方法
@爱学习,爱劳动:
没有使用过这个定时器,不过不应该使用返回值来判断,正在运行的应该是没有返回值的吧?
应该是进入任务时置个标志,任务完成时才释放,下次任务先判断标志,正在运行的状态就略过本次任务。
@爱学习,爱劳动: 你可以给个完整点的代码来看看
@X听雨:
@Service
public class TestInsert {
@Autowired
private CommonDao dao;
public String insert(String sql){
for(int i=0;i<10;i++){
for(int j=0;j<50;j++){
System.out.println("---------------------------"+i);
System.out.println("sql语句"+sql);
}
return "ERROR";
}
return "SUCCESS";
}
给点好建议 这是个模型 大概就是个这意思
@X听雨: 这个够吗?还是把用的类的方法都贴出来
@爱学习,爱劳动: 不清楚你具体的逻辑,如果返回error可以在下次再被调用的话,大概可以这么写
private static boolean isRuning = false;
public String insert(String sql){
if(isRuning) return "ERROR";
try {
isRuning = true;
//do some thing
return "ERROR";
} catch (Exception e) {
e.printStackTrace();
}finally{
isRuning = false;
}
return "SUCCESS";
}
一般都是通过日志打印
譬如run方法里面加入以下
log.info("定时器启动,时间:"+new Date())
try{
}catch(){
log.error("出现异常")
return;
}
log.info("定时器结束,时间:"+new Date())
当日志打印有结束语句就证明跑完了
谢谢大家 我找到答案了 我使用quartz 定时器 在job中实现StatefulJob接口 就可以实现 当这个任务job没有结束时 不会重新启动该任务job