在java中调度任务

qf9go6mv  于 2023-02-18  发布在  Java
关注(0)|答案(5)|浏览(106)

在我的java web应用程序中,我想调度一个任务。
我在网上搜索了很多,但找不到适合我的调度程序。在应用程序中,我有不同类型的用户。对于特定的用户类型,我想调度一个任务。
在用户采取关键操作时:

  • 我想向该特定用户发送电子邮件,15分钟后
  • 我想再发一封邮件,30分钟后
  • 我想再发送一封电子邮件并关闭计划程序。

我知道用户什么时候采取关键行动,以及如何发送电子邮件,但我对日程安排没有太多经验。
有人能帮我处理这个案子吗?

soat7uwm

soat7uwm1#

您也可以使用JobRunr,一个易于使用的和open-source Java Scheduler
要使用JobRunr将作业安排在15分钟后,您将使用以下代码:

JobId firstEmailJobId = BackgroundJob.enqueue(() -> yourService.sendFirstEmail());

JobId secondEmailJobId = BackgroundJob.schedule(Instant.now().plus(15, minutes), () -> yourService.sendSecondEmail());

然后,您可以对其他2封电子邮件重复这些步骤。如果您想取消发送这些电子邮件(例如,当用户采取行动时),您可以通过作业ID轻松地再次删除这些作业(当然,只有当作业尚未执行时)
JobRunr还提供了自动重试功能(例如,邮件服务器或sendgrid停机)和嵌入式 Jmeter 板,允许您跟踪您的作业执行情况。

zy1mlcev

zy1mlcev2#

我建议您看一看quartz调度API http://quartz-scheduler.org/
到目前为止,我已经在几个项目中使用过它,在中设置和配置新作业真的很容易。它支持基于Cron的触发器或SimpleTrigger,因此您可以在Java代码中计算计划事件的时间,也可以简单地向其传递Cron字符串。
另一个优点是,它真的很容易配置Spring。

busg9geu

busg9geu3#

为什么不使用ScheduledExecutor?http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
它有一个方法schedule,允许你安排你想要的任何任务(你传递一个runnable),所以基本上,你为每个用户安排一个发送电子邮件的任务和另一个任务。

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));
    }
}

您可能希望使用具有多个线程的计划线程池。

idv4meu8

idv4meu84#

使用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);
ukdjmx9f

ukdjmx9f5#

以下是有关如何使用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");
}
}

相关问题