我是微服务世界的新手,尤其是vertX。即使没有可用的数据库连接(例如配置中缺少数据库URL),我仍希望我的Verticle能够启动。我已经设法做到这一点,我的Verticle正在开始。
现在的问题是,当数据库连接再次可用并连接到它时,我希望我的Verticle注意到。我怎样才能做到这一点 ? 我想创建另一个Verticle" DatabaseVerticle.java"这将在事件总线上发送当前的DB配置,我的初始Verticle将使用此消息并检查配置信息是否一致(回复成功)或仍然缺少一些数据(回复失败并再次检查DatabaseVerticle)。 / p>
这可能有用(也可能没有),但对我来说似乎不是最佳解决方案。
如果有人能提出更好的解决方案,我会很高兴。谢谢!
答案 0 :(得分:1)
对于您的使用案例,我建议您使用vertx-config
。特别是,请查看Vert.x Config文档的Listening to configuration changes部分。
您可以创建配置检索器并为更改设置处理程序:
ConfigRetrieverOptions options = new ConfigRetrieverOptions()
.setScanPeriod(2000)
.addStore(myConfigStore);
ConfigRetriever retriever = ConfigRetriever.create(vertx, options);
retriever.getConfig(json -> {
// If DB config available, start the DB client
// Otherwise set a "dbStarted" variable to false
});
retriever.listen(change -> {
// If "dbStarted" is still set to false
// Check the config and start the DB client if possible
// Set "dbStarted" to true when done
});
答案 1 :(得分:0)
理想的方式是告诉您的服务有关数据库连接的其他服务。无论是通过事件总线还是HTTP,你可以做的是当有人试图访问你的数据库时,只是尝试进行一些数据库调用并处理异常,返回一个布尔值为false。现在,当您在事件总线上收到消息时,请将其消耗并保存在某个配置pojo中。现在,当有人试图访问您的数据库时,请查找配置,如果可用,则建立连接。
您的消费者:
public void start(){
EventBus eb = vertx.eventBus();
eb.consumer("database", message -> {
config.setConfig(message.body());
});
}
您的数据库客户端(例如Mongo):
public class MongoService{
private MongoClient client;
public boolean isAvailable = false;
MongoService(Vertx vertx){
if(config().getString("connection")){
client = MongoClient.createShared(vertx, config().getString("connection"));
isAvailable = true;
}
}
}
答案 2 :(得分:0)
并非Vertx中的所有内容都应该由另一个Verticle解决
在这种情况下,您可以使用.periodic()
http://vertx.io/docs/vertx-core/java/#_don_t_call_us_we_ll_call_you
我假设您有一些首次检查数据库的功能
我们称之为checkDB()
class PeriodicVerticle extends AbstractVerticle {
private Long timerId;
@Override
public void start() {
System.out.println("Started");
// Should be called each time DB goes offline
final Long timerId = this.vertx.setPeriodic(1000, (l) -> {
final boolean result = checkDB();
// Set some variable telling verticle that DB is back online
if (result) {
cancelTimer();
}
});
setTimerId(timerId);
}
private void cancelTimer() {
System.out.println("Cancelling");
getVertx().cancelTimer(this.timerId);
}
private void setTimerId(final Long timerId) {
this.timerId = timerId;
}
}
我在timerId
播放了一些内容,因为我们无法立即将其传递给cancelTimer()
。但除此之外,它很简单。