我在一个带有多个verticle的vertx应用程序上编写,这些verticle访问一个数据库。每个数据库包代表一个java类。这些类中的每一个都可以实现为一个单例类。
我做了一个小例子:2个verticles,它们正在使用database.dologinuser。
package testInject;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
public class App {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
DeploymentOptions options = new DeploymentOptions().setWorker(true).setInstances(5);
vertx.deployVerticle("java:testInject.Test1",options);
vertx.deployVerticle("java:testInject.Test2",options);
}
}
package testInject;
import com.google.inject.Inject;
public class Test1 extends MyVerticle {
// @Inject
Database db = new Database();
@Override
public void start() throws Exception {
System.out.println("Verticle " + this.getClass().getName() + " " + this);
db.doLoginUser();
}
}
package testInject;
import com.google.inject.Inject;
public class Test2 extends MyVerticle {
// @Inject
Database db = new Database();
@Override
public void start() throws Exception {
System.out.println("Verticle " + this.getClass().getName() + " " + this);
db.doLoginUser();
}
}
package testInject;
import io.vertx.core.Vertx;
import io.vertx.core.Context;
import io.vertx.core.AbstractVerticle;
abstract class MyVerticle extends AbstractVerticle {
@Override
public void init(Vertx vertx, Context context) {
super.init(vertx,context);
/* What to do to inject Database into the verticles ????*/
}
}
package testInject;
import com.google.inject.Singleton;
@Singleton
public class Database {
public void doLoginUser() {
System.out.println("Done");
}
}
为了让事情变得简单一点,我不想每次都用database db=database.getinstance()实现相同的模式,也不想在每个垂直方向上创建这个数据库类的新示例(这是浪费内存)。只要一个“@inject database db”就好了。
因为vertx通过类名初始化verticle类,所以我不能使用guice injector.getinstance(test1.class)函数来进行绑定。我不知道如何在创建verticle类时在构造函数或初始化例程中自动绑定数据库类。我的想法可行吗?如果可行怎么办?
泰铢nik
1条答案
按热度按时间jei2mxaa1#
我不认为你可以像在spring或guice中那样注入到verticles中。
您应该将每个垂直视为独立的java进程,您只能从外部启动或终止它。
也就是说,你必须创造一个
db
每个垂直的示例。当然你可以在你的超类中计算出它的创建MyVerticle
以节省一些代码,但db per verticle概念仍然存在。处理这类问题的极端方法是
db
示例,并通过事件总线与之通信。