每天都要在某个时间执行一个任务 这个时间是 动态的 从数据库取的
比如今天是要在22点45分15秒执行一个任务 明天的这个时间是 23点45分11秒 以此类推 每天都会有一个动态的时间任务
请问这个怎么用java实现 貌似quartz实现不了
用java的定时器可以实现,但是需要用两个定时器。一个每日执行,一个每秒执行。
实例代码:Task是最终的任务;SheduledTask接收任务时间,每隔一秒匹配一下当前时间,如果匹配就执行Task;
还有一个日定时器,可以设置每天0点执行,从数据库获取当日的任务时间,启用秒定时器。
public class Task implements Runnable{
@Override
public void run() {
System.out.println("do task.");
}
}
秒定时器:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 定时器:接收一个时间,然后每隔开一秒比对是否是任务执行时间,如果是则执行任务
* @author bh
*/
public class SheduledTask implements Runnable{
private Task task; //需要执行的任务
private String time;//任务执行的时间
//定时器每隔一秒执行run方法
private ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
public SheduledTask(Task task,String time){
this.task = task;
this.time = time;
}
@Override
public void run() {
//判断当前时间是否为执行时间,如果是则执行任务,结束后关闭定时器
System.out.println("每秒钟定时任务:比对任务时间,如果匹配则执行任务...");
String now = nowAsString();
if(now.equals(time)){
this.task.run();
service.shutdown();
}
}
public void execute(){
service.scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS);
}
private String nowAsString() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
return df.format(new Date()).toString();
}
}
日定时器:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author bh
*/
public class DailyTask implements Runnable{
@Override
public void run() {
//定时生成一个任务时间
System.out.println("每日定时任务...");
//此次时间从数据库获取
String time = "2015-04-23 15:01:30";
Task task = new Task();
new SheduledTask(task,time).execute();
}
public static void main(String[] args) {
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
DailyTask dailyTask= new DailyTask();
//每天凌晨执行当日定时任务
service.scheduleAtFixedRate(dailyTask, 0, 1, TimeUnit.DAYS);
}
}
用Quartz,这个框架专门帮你干这个的,具体google下