在我的java Web应用程序中,我想安排一项任务。
我在网上搜索了很多,但找不到合适的调度程序。在应用程序中,我有不同类型的用户。对于特定用户类型,我想安排任务。
当用户采取关键行动时:
我知道用户何时采取关键行动以及如何发送电子邮件,但我对调度没有太多经验。
有人可以帮我解决此案吗?
答案 0 :(得分:2)
为什么不使用ScheduledExecutor? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
它有一个方法schedule
,允许您安排任何你想要的任务(你传递一个可运行的)。所以基本上,对于每个用户,您都安排了发送电子邮件和安排其他任务的任务。
import static java.util.concurrent.TimeUnit.*;
class Task implements Runnable {
private final User user;
private final int rep;
private final ScheduledExecutorService scheduler;
public Task(User user, int rep, ScheduledExecutorService scheduler) {
this.user = user;
this.rep = rep;
this.scheduler = scheduler;
}
public void run() {
// send an e-mail to user
if (rep > 0)
scheduler.schedule(new Task(user, rep - 1, scheduler), 15, MINUTES);
}
}
class Example {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
public void sendEmails() {
// foreach user
scheduler.submit(new Task(user, 3, scheduler));
}
}
您可能希望使用具有多个线程的计划线程池。
答案 1 :(得分:2)
使用Quartz Scheduler来安排任务
所需步骤 -
1)石英作业
public class HelloJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello Quartz!");
}
}
2)创建一个触发器 - CronTrigger - 每30秒运行一次
CronTrigger trigger = new CronTrigger();
trigger.setName("dummyTriggerName");
trigger.setCronExpression("0/30 * * * * ?");
3)创建调度程序
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
答案 2 :(得分:1)
以下是有关如何使用Java计时器的教程: http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html
您可以按顺序创建多个计时器任务,以满足您的目标。
实施例 代码报价:
import java.util.Timer;
import java.util.TimerTask;
/**
* Simple demo that uses java.util.Timer to schedule a task
* to execute once 5 seconds have passed.
*/
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
public static void main(String args[]) {
new Reminder(5);
System.out.format("Task scheduled.%n");
}
}
答案 3 :(得分:0)
我建议你看看石英调度API http://quartz-scheduler.org/
到目前为止,我已在多个项目中使用它,并且很容易设置和配置新作业。它支持基于cron的触发器或简单触发器,因此您可以计算Java代码中预定事件的时间,也可以简单地传递一个cron字符串。
另一个优点是弹簧配置非常简单。