Vertx.io 安排任务

Vertx.io Scheduling Tasks

我刚开始工作的一家公司有一个系统。该系统允许客户通过 SMS 管理他们的订阅者通知。用户通过 Web 应用程序登录并创建消息(每条消息都有发送 date_time、目的地 phone_number 等)。这些消息保存在 mysql 数据库中。他们还有一个使用 jsvc 实现的 java 应用程序。此应用程序每 1 分钟保持 24/7 全天候读取数据库并发送消息(通过外部网络提供商 API),这是针对应在特定时间发送的消息。

我被带进来重写整个事情。目前我无法更改任何涉及 Web 应用程序和数据库的内容。我只是想用 vertx 重写 jsvc。

我已经编写了与数据库通信的 vertx 服务和另一个与外部通信的服务 API。

我想过创建一个每小时运行一次的周期函数(它读取数据库并获取应该在接下来的一个小时内发送的所有消息),然后安排将这些消息发送到进行通信的服务与外部 API.

我的问题是,我将如何实现这样的调度?每条消息的发送date_time在数据库中精确到分钟。我正在查看 Chime 以及如何合并它,但我还没有看到一个很好的例子来帮助我了解正确的方法。

那么,使用 Chime 将 eventbus 消息调度到外部 API 服务的正确方法是什么?还有另一种方法可以构建这个用例吗?

Vert.x 为此提供了 setPeriodic()

您可以每小时 运行 一份工作,例如:

vertx.setPeriodic(1000 * 60 * 60, (l) -> {
    // Your code here        
});

查看 Java 计时器以进行调度或 RabbitMQ 客户端。

public void timerSchdule() {
    TimerTask repeatedTask = new TimerTask() {
        public void run() {
            System.out.println("performing activity on " + new Date());
        }
    };
    Timer timer = new Timer("Timer");
    long delay = 1000L;
    long period = 1000L * 60L * 60L * 24L;
    timer.scheduleAtFixedRate(repeatedTask, delay, period);
}

这是 improvement/extension 阿列克谢的回答。

vertx.setPeriodic(1000 * 60 * 60, (l) -> 
{
    for(task t: tasks_in_that_hour)
    {
        long timerID = vertx.setTimer(t.timeDiff(), id -> 
        {
            //your code here
        });
    }

});

好吧,如果你在那一小时内有数百万个任务,那么你可以使用一个 for 循环,它不会获取下一个我们的任务,而是接下来的 1000 个任务。在那种情况下,您必须将该周期性计时器更改为单个计时器:vertx.setTimer(...) 到任务 1001(可能指向该任务之前几毫秒的时间^^)。 for 循环中的代码与我发布的代码相同。