如何在Eclipse Vert.x中执行长时间运行/轮询操作

时间:2019-12-23 20:07:23

标签: microservices vert.x

我有一种情况,我们需要继续轮询所有活动用户的数据库表,并执行api调用以从其收件箱中提取所有未读的电子邮件。我的方法是使用两个顶点,一个用于轮询,另一个用于为用户获取电子邮件。第一个垂直节点在找到用户后,会通过事件总线将消息(userId)发送到第二个垂直节点以获取电子邮件。这样,当用户很多时,我可以增加第二个Verticle实例的数量。

以下两种方法可以发现我可以用来轮询数据库以查找活动用户,然后为每个用户执行api调用。

  1. vertx.setPeriodic
  2. vertx.executeBlocking

但是在手册中,它提到对于长时间运行/轮询的任务,最好创建一个应用程序托管的线程来处理任务。

我解决问题的方法是否正确,还是有更好的方法来解决当前的问题? 如果我浏览了应用程序托管线程,请帮助您举例说明。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以为此创建专用的工作线程池,并在其上运行定期任务:

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());
        });
    }
}