我有一种情况,我们需要继续轮询所有活动用户的数据库表,并执行api调用以从其收件箱中提取所有未读的电子邮件。我的方法是使用两个顶点,一个用于轮询,另一个用于为用户获取电子邮件。第一个垂直节点在找到用户后,会通过事件总线将消息(userId)发送到第二个垂直节点以获取电子邮件。这样,当用户很多时,我可以增加所需的第二个垂直实例的数量。
按照以下两种方式,我可以用来轮询数据库以查找活动用户,然后为每个用户执行api调用。
但是在手册中提到,对于长时间运行/轮询的任务,最好创建一个应用程序托管的线程来处理任务。
我解决问题的方法是正确的,还是有更好的方法来解决当前的问题?如果我经过一个应用程序托管线程,请提供示例帮助您进行说明。
谢谢。
您可以为此创建专用的工作线程池,并在其上运行定期任务:
public class PeriodicWorkerExample {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new MyPeriodicWorker(), new DeploymentOptions()
.setWorker(true)
.setWorkerPoolSize(1)
.setWorkerPoolName("periodic"));
}
}
class MyPeriodicWorker extends AbstractVerticle {
@Override
public void start() {
vertx.setPeriodic(1000, (r) -> {
System.out.println(Thread.currentThread().getName());
});
}
}