我刚开始工作的公司有一个系统。该系统允许客户通过SMS管理其订户通知。用户通过Web应用程序登录并创建消息(每条消息都有发送date_time,目标电话号码等)。这些消息保存在mysql数据库中。他们也有一个使用jsvc实现的Java应用程序。该应用程序每1分钟保持24/7全天候读取数据库并发送消息(通过外部网络提供商API),这就是应该在该特定时间发送的消息。
我被带去重写整个内容。目前,我无法更改与Web应用程序和数据库有关的任何内容。我只是想使用vertx重写jsvc。
我已经编写了与数据库通信的vertx服务和与外部API通信的另一服务。
我曾想过要创建一个每小时运行一次的定期函数(它读取数据库并获取应在下一小时内发送的所有消息),然后计划将此消息发送到与外部通信的服务API。
我的问题是,我将如何实现这种调度?每条消息的发送date_time精确到数据库中的分钟。我正在研究Chime以及如何合并它,但是我还没有看到一个很好的例子来帮助我了解正确的方法。
那么,使用Chime将事件总线消息调度到外部API服务的正确方法是什么,还有另一种方法来构造该用例?
答案 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循环中的代码将与我发布的相同。