Vertx.io计划任务

时间:2019-03-07 15:36:23

标签: java scheduling vert.x

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

我被带去重写整个内容。目前,我无法更改与Web应用程序和数据库有关的任何内容。我只是想使用vertx重写jsvc。

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

我曾想过要创建一个每小时运行一次的定期函数(它读取数据库并获取应在下一小时内发送的所有消息),然后计划将此消息发送到与外部通信的服务API。

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

那么,使用Chime将事件总线消息调度到外部API服务的正确方法是什么,还有另一种方法来构造该用例?

3 个答案:

答案 0 :(得分:0)

Vert.x为此提供了setPeriodic()

您可以每小时执行以下操作:

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

答案 1 :(得分:0)

查看用于调度的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);
}

答案 2 :(得分:0)

它是对Alexeys答案的改进/扩展。

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个任务)中提取任务。在那种情况下,您必须将该周期计时器更改为singleTimer:vertx.setTimer(...)更改为任务1001(可能指向该任务之前几毫秒的时间^^)。 for循环中的代码将与我发布的相同。