如何实施预定通知服务?

How do I implement a Scheduled Notification service?

如何实施计划通知服务以在应用程序用户的首选时间向他们发送警报? 目前,他们正在收到即时通知;但是,有人可以建议我如何安排吗?


String emailBody = "Hello,\n" + "\n" + "You have received a new notification " ;
emailService.quickEmail(String.join(" ,", emailList), emailSubject, emailBody);

1.使用 ScheduledExecutorService

ScheduledExecutorService 是一个 ExecutorService,它可以在指定的延迟后或定期执行指令。 schedule 方法构造具有不同延迟的任务和 return 可用于取消或检查其执行的任务对象。 scheduleAtFixedRate() 和 scheduleWithFixedDelay() 方法生成 运行 以固定速率或固定延迟 运行 的任务,直到它们被取消。

这里有一个 class 方法,它有一个创建 ScheduledExecutorService 的方法,运行 每秒执行一次过程。 :


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
class Main
{
    private static void run() {
        System.out.println("Running: " + new java.util.Date());
    }
 
    public static void main(String[] args)
    {
        ScheduledExecutorService executorService;
        executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleAtFixedRate(Main::run, 0, 1, TimeUnit.SECONDS);
    }
}

2。使用定时器 Class

线程可以使用计时器 class 来安排任务以便稍后在后台线程中执行。 任务可以安排为单次执行或定期重复执行。 schedule() 和 scheduleAtFixedRate() 函数分别为重复的固定延迟和固定速率执行安排提供的作业。 这些方法目前负担过重。

以下代码使用定时器 class 每秒 运行 方法 运行(在 Java 8 及更高版本中):

import java.util.Timer;
import java.util.TimerTask;
 
class Main
{
    public static void main(String[] args) throws InterruptedException
    {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("Running: " + new java.util.Date());
            }
        }, 0, 1000);
    }
}

3。使用 Guava 库

另一种选择是利用 Guava 的 AbstractScheduledService class 在应用程序 运行ning 时执行一些周期性活动。 Subclasses 提供 运行OneIteration() 以及标准的 startUp() 和 shutDown() 方法来定义作业的一次迭代。

必须实现scheduler() 函数来指定执行计划。 通常,您将使用 AbstractScheduledService 的给定计划之一。 调度器,newFixedRateSchedule() 或 newFixedDelaySchedule(),与 ScheduledExecutorService 的常用功能匹配。

import com.google.common.util.concurrent.AbstractScheduledService;
 
import java.util.Date;
import java.util.concurrent.TimeUnit;
 
class ScheduledExecutor extends AbstractScheduledService
{
    @Override
    protected void startUp() {
        System.out.println("Job started at: " + new java.util.Date());
    }
 
    @Override
    protected void runOneIteration() throws Exception {
        System.out.println("Running: " + new java.util.Date());
    }
 
    @Override
    protected Scheduler scheduler() {
        // execute every second
        return Scheduler.newFixedRateSchedule(0, 1, TimeUnit.SECONDS);
    }
 
    @Override
    protected void shutDown() {
        System.out.println("Job terminated at: " + new java.util.Date());
    }
}
 
class Main
{
    public static void main(String[] args) throws InterruptedException
    {
        ScheduledExecutor executor = new ScheduledExecutor();
        executor.startAsync();
        Thread.sleep(10000);
        executor.stopAsync();
    }
}

4.使用 Quartz 调度器

我们还可以使用 Quartz 作业调度库,它几乎可以在任何 Java 应用程序中使用。 Quartz 可用于为 运行 数十、数百甚至数千个作业设计简单或复杂的时间表,这些作业的活动被描述为标准 Java 组件,几乎可以执行您希望它们执行的任何操作.