短信发送平台,需要实现一个定时器,每个月1号早8点给特定人群发送短信
timer.scheduleAtFixedRate(timerTask, date, period);
第三个参数该怎么设?毕竟每个月的1号对应第三个参数不是固定值?
timer.scheduleAtFixedRate(timerTask, date, period);
第三个参数该怎么设?毕竟每个月的1号对应第三个参数不是固定值?
解决方案 »
- 无法修改xml文件
- 关于ecplice和myecplice
- 为什么我在编译servlet时,javax.servlet和javax.servlet.http都找不到
- 天理何在 strtus-config.xml不认<plug-in>!!!!!!!!!!!!
- linux WebServer 间文件传输
- Hibernate保存结果为什么会失效???????????/
- 要做个web系统,不知道选什么server,那位高人给点意见
- 关于取得系统参数问题
- eclipse + hibernate + tanghan plug_in
- 如果修改了 storm 的 spout 和 bolt 代码,就 kill 掉作业,重新提交吧。那么 kill 作业的时候如何做 cleanup 的工作呢?
- java 生成静态页面问题
- 在struts1.3的哪个struts包中可以查看struts标签相应的处理类
Java里该如何搞定?
Spring+quartz的 下面的链接是详解,希望对你有帮助
http://kai2008.javaeye.com/blog/435675
是啊,单独使用quartz也是没问题的。
lz参考一下这里官网的代码。http://www.quartz-scheduler.org/docs/cookbook/index.htmlgood luck
按照LZ的要求那么第三个参数就不是固定的了,而要每次都事先计算出来LZ要计算下个也有多少天噢 period = 1000 * 60 * 60 * 每月最后一天的日期
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class DelayQueueTest { public static void main(String[] args) throws InterruptedException { SchedulerManager manager = new SchedulerManager();
manager.addJob(new EveryMinuteDelay(new MyJob()));
manager.start(); printCurrentTime();
sleepMinutes(3); // 休息 3 分钟后关掉
manager.stop(); // 停止工作
printCurrentTime();
} private static void sleepMinutes(long minutes) {
try {
TimeUnit.MINUTES.sleep(minutes);
} catch (InterruptedException e) {
e.printStackTrace();
}
} private static void printCurrentTime() {
System.out.printf("Current: %tF %<tT%n", System.currentTimeMillis());
}
}/**
* <p>任务调度管理器</p>
*
* 2010-5-28 下午11:30:20
*/
class SchedulerManager { private ExecutorService executor;
private DelayQueue<JobDelayed> jobs;
private Scheduler scheduler; public SchedulerManager() {
this(1);
} /**
* 根据线程池中线程数量构造调度管理器
* @param threadPool
*/
public SchedulerManager(int threadPool) {
this.jobs = new DelayQueue<JobDelayed>();
// 由于调度管理器需要占用一个线程,因此需要加 1
this.executor = Executors.newFixedThreadPool(threadPool + 1);
this.scheduler = new Scheduler(this);
} /**
* <p>添加需要计划的任务</p>
*
* @param job
*/
public void addJob(JobDelayed jobDelayed) {
jobDelayed.nextTime(); // 计算下一次执行的时间
jobs.put(jobDelayed); // 添加到延迟队列中去
} public void start() {
scheduler.start(); // 启动任务调度器
} public void stop() {
scheduler.stop(); // 停止任务调度器
} private void execute() throws InterruptedException {
submit(take());
} /**
* <p>将任务提交给线程池去执行</p>
*
* @param task
*/
private void submit(Runnable task) {
executor.submit(task);
} /**
* <p>强制停止工作</p>
*/
private void shutdown() {
executor.shutdown();
} /**
* <p>获取到时间的任务,如果该任务下一次还需要执行,将该任务加回队列中去。</p>
*
* @return
* @throws InterruptedException
*/
private JobDelayed take() throws InterruptedException {
JobDelayed jobDelayed = jobs.take();
if(jobDelayed.hasNext()) {
addJob(jobDelayed);
}
return jobDelayed;
} /**
* <p>调度器</p>
* 2010-5-28 下午11:40:58
*/
private static class Scheduler implements Runnable { private SchedulerManager manager;
private boolean running = false; /**
* 使用调度管理器构造
* @param manager
*/
public Scheduler(SchedulerManager manager) {
this.manager = manager;
} /**
* <p>启动该调度器</p>
*/
public void start() {
if(!running) {
manager.submit(this);
this.running = true;
}
} /**
* 执行任务调度工作
*/
@Override
public void run() {
while(running) {
try {
manager.execute();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* <p>强制停止该调度器</p>
*/
public void stop() {
manager.shutdown();
running = false;
}
}
}/**
* <p>需要进行任务调度的工作内容</p>
*/
interface Job {
public void execute();
}/**
* <p>测试工作,输出当前时间</p>
*/
class MyJob implements Job {
public void execute() {
System.out.printf("JOB OUTPUT: %tF %<tT%n", System.currentTimeMillis());
}
}/**
* <p>需要进行调度工作的任务</p>
*/
interface JobDelayed extends Delayed, Runnable { /**
* <p>计算下一次执行的时间</p>
*/
public void nextTime(); /**
* <p>下一次是否需要执行</p>
*/
public boolean hasNext();
}/**
* <p>需要进行每分钟调度工作的任务</p>
*/
class EveryMinuteDelay implements JobDelayed { private long nextTime;
private Job job; public EveryMinuteDelay(Job job) {
this.job = job;
} public void nextTime() {
Calendar c = Calendar.getInstance();
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
c.add(Calendar.MINUTE, 1);
this.nextTime = c.getTimeInMillis(); // 这个任务的 nextTime 为下一分钟
} public boolean hasNext() {
return true; // 永远执行下去
} @Override
public long getDelay(TimeUnit unit) {
return nextTime - System.currentTimeMillis(); // 是否超时
} @Override
public int compareTo(Delayed o) {
return (int)(o.getDelay(TimeUnit.MILLISECONDS) - getDelay(TimeUnit.MILLISECONDS));
} @Override
public void run() {
job.execute(); // 执行任务
} public String toString() {
return String.format("next: %tF %<tT", nextTime);
}
}
搞那么复杂干嘛?其实你这问题挺简单的,不要想得太复杂了:思路:就使用java 的Timmer类,就可以搞定了。给你个例子
/**
* @author troy(J2EE)
* @version 1.0
*/
import java.util.Timer;
import java.util.TimerTask;
public class Test {
private final Timer timer = new Timer();
private final static long DELAY_TIME=2 * 1000;//任务延迟时间:单位毫秒
private final static long PERIO_TIME=2 * 1000;//任务运行周期: 单位毫秒
public void start() {
timer.schedule(new SendMsgTask(), DELAY_TIME,PERIO_TIME);
}
public static void main(String[] args) {
Test test = new Test();
test.start();
}
}
class SendMsgTask extends TimerTask{
private static int i=0;
public void run() {
sendMsg();
}
private void sendMsg() {
i++;
System.out.println("发送短信 -- 开始 (第"+i+"次)");
}
}
任务执行时,先延迟一定时间,刚好到第二天早晨的8点时,任务开始执行; 任务运行周期为 :24 小时(每天)DELAY_TIME 这个参数: 是延迟时间,你可以new Date()获取当前时间,取到后跟 8点进行比对,设置好延迟时间这个参数;PERIO_TIME 这个参数: 是任务运行周期,你这种情况的话 应该设置为:24*60*60*1000备注:考虑问题要严谨,有几个问题要注意:1)何时关闭 计时器?2)任务执行失败了 怎么处理? 3)是否要配个日志?……
* @author troy(J2EE)
* @version 1.0
*/
import java.util.Timer;
import java.util.TimerTask;
public class Test {
private final static Timer timer = new Timer();
public final static Timer getTimer(){
return timer;//获取timer对象的实例
}
private final static long DELAY_TIME=2 * 1000;//任务延迟时间:单位毫秒
private final static long PERIO_TIME=2 * 1000;//任务运行周期: 单位毫秒
public void start() {
timer.schedule(new SendMsgTask(),DELAY_TIME,PERIO_TIME);//设置定时任务
}
public static void main(String[] args) {
Test test = new Test();
test.start();//开启任务
}
}
class SendMsgTask extends TimerTask{
private static int i=0;
public void run() {
sendMsg();
}
private void sendMsg() {
i++;
System.out.println("发送短信 -- 开始 (第"+i+"次)");
if(i==5){
Test.getTimer().cancel();//当发送5次后停止--计时器
}
}
}
程序运行结果:---------- java1.5 -- 运行 ----------发送短信 -- 开始 (第1次)
发送短信 -- 开始 (第2次)
发送短信 -- 开始 (第3次)
发送短信 -- 开始 (第4次)
发送短信 -- 开始 (第5次)输出完毕 (耗时 10 秒) - 正常终止
既然相隔的周期不相同。就不要使用timer.scheduleAtFixedRate(timerTask, date, period);
改用只执行一次的schedule(TimerTask task, long delay);
然后每次执行后,计算出下一次执行所需的间隔。
这样就简单多了。
也不需要什么框架