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 循环中的代码与我发布的代码相同。
我刚开始工作的一家公司有一个系统。该系统允许客户通过 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 循环中的代码与我发布的代码相同。