如何在Java中在特定时间间隔后调用方法

4

以下是使用案例:

我正在使用Java(带有Spring)

一旦用户(通过Web应用程序)确认订阅,我想在30分钟后准确发送电子邮件给他。

现在该怎么做?我需要一个消息代理吗?或者类似于ScheduledExecutorService的东西? 我需要某种类型的队列吗?

请给予建议。


我认为一个更好的标题可以是“如何在事件发生后30分钟发送邮件。” - Nishant
请发送您的代码,如果您已经完成了我的ID是manisathasivam@gmail.com - Mani
4个回答

4

您可以考虑使用Quartz Scheduler来解决这个问题。

另外,一种常见的策略是每隔30分钟左右批量发送所有待发邮件。使用Quartz也可以帮助实现这一点。


谢谢,但实际上这会怎么发生呢?我猜想每次事件发生时,都会创建一个新的线程,等待30分钟,然后发送邮件,最后结束线程,是吗? - adi
我们可以使用ScheduledExecutorService来完成这个任务吗? - adi
@adi 我不确定Quartz的确切内部工作方式,但可以放心,它非常高效...我已经使用它来驱动数千个任务,没有任何显著的资源耗尽。就特定的邮件任务而言...我想Quartz会做得很好。我从未使用过ScheduledExecutorService,所以不能诚实地对其发表评论。 - Nishant

2
您可以使用Quartz Scheduler。它非常容易使用。您可以每周或每30分钟安排一次任务,基本上您想做什么就可以了。

2
创建一个计时器对象
 private Timer myTimer;

在主方法中

myTimer = new Timer();
    myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
           //your method
        }

    }, 0, 200);

好的回答。救了一天。 - 4xMafole

0

发送邮件后,线程并不会立即结束。当您配置Quartz时,将自动创建一个新线程并在指定的间隔时间执行分配的任务,或者您也可以使用Timer类,这非常容易使用。

    Timer timer = new Timer(); // Get timer

    long delay = 30 * 60 * 1000; // 3o min delay

    // Schedule the two timers to run with different delays.
    timer.schedule(new MyTask(), 0, delay);

...................



class MyTask extends TimerTask {

    public void run() {
        // business logic
        // send mail here
    }
}

如果线程在发送邮件后没有结束,会发生什么?过一段时间后,我会有数百个线程吗? - adi
一个单独的线程将会运行,当时间到达时任务会被执行。当你创建一个定时器并且它被调度后,它在后台运行并按照指定的间隔执行任务。尝试以下示例:public class Main { public static void main(String[] args) { Timer timer = new Timer(); long delay = 1000; // 1秒延迟 timer.schedule(new MyTask(), 0, delay); while(true){ } } }public class MyTask extends TimerTask { public void run() { // 业务逻辑 System.out.println("邮件已发送"); } } - Partha
那么如果我需要更改时间怎么办?例如,我希望延迟时间在两个时间范围内。 - grep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接