我在这里给出了我的天真解决方案,我不知道它是否会完全解决您的问题,但这里是我的思考过程。
1)轮询位,是的,你确实可以有一个工作者verticle阻止呼叫[或者你也可以在这里使用异步位,因为你已经有Async Postgress JDBC client]每10secs部分。像这样的代码片段可以帮助你
vertx.setPeriodic(10000, id -> {
// This handler will get called every 10 seconds
JsonObject jdbcObject = fetchFromJdbc();
eventBus.publish("INTRESTED_PARTIES", jdbcObject);
});
2)对于听力部分的所有其他verticles可以订阅事件总线和监听这个地址,并且将得到的消息不顺心的事会发生
3 )这是为了确保并不是所有正在运行的jar实例都开始轮询数据库,为此,我认为最好的方法就是不要在任何jar中部署verticle,并使用运行时vertx命令以独立的方式运行verticle像
vertx run DatabasePoller.java -cluster
如果你真的想要非常喜欢,你可以抛出Service Discovery来确保如果Verticle的服务已经注册,那么其他部署将不会触发注册。
但我想给你大拇指考虑事件获取信息更好的方式来处理系统间通信。
如果您使用的是相同的事件总线名称,则在其上发布消息。只有一名工人会消耗它并开始工作。 –
当然,我明白这一点。我这里的用例是我需要每10秒轮询一次数据库(意思是每隔10秒向事件总线发出一条消息,触发处理程序执行查询)。但我不希望所有的verticle在不同的进程中触发消息,从而在多个进程中触发jdbc调用。 – user1189332
首先,为什么在Vert.x提供非阻塞PostGreSQL实现时使用JDBC?其次,如果你想要做的唯一事情是每x个secons查询数据库,为什么不为它创建一个单独的Verticle?你可以调用'ResultSet :: toJson'来将结果查询转换成Json并将其发布到'EventBus'的保留地址上。 –