在java中安排任务

时间:2014-03-11 09:04:36

标签: java scheduled-tasks timertask

在我的java Web应用程序中,我想安排一项任务。

我在网上搜索了很多,但找不到合适的调度程序。在应用程序中,我有不同类型的用户。对于特定用户类型,我想安排任务。

当用户采取关键行动时:

  • 我想在15分钟后向该特定用户发送电子邮件
  • 我想在30分钟后发送另一封电子邮件
  • 我想发送另一封电子邮件并关闭调度程序。

我知道用户何时采取关键行动以及如何发送电子邮件,但我对调度没有太多经验。

有人可以帮我解决此案吗?

4 个答案:

答案 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字符串。

另一个优点是弹簧配置非常简单。