使用vertx嵌入和Guice为Verticles设置多个实例

问题描述 投票:0回答:2

我在同一台机器上使用 Vertx 集群(开发模式)。 我也使用 guice 来注入一些 pojo。

但是,当我尝试增加 Verticle 实例时,我得到:

java.lang.IllegalArgumentException: Can't specify > 1 instances for already created verticle
    at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:70)
    at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:516)
    at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:511)
    at com.mycompany.world_map_service.web.starter.StarterVerticle.lambda$main$0(StarterVerticle.java:39)

这就是我的配置方式:

 public static void main(String[] args) throws Exception {

        final Logger logger = Logger.getLogger(StarterVerticle.class);


        ClusterManager mgr = new HazelcastClusterManager();
        VertxOptions options = new VertxOptions().setClusterManager(mgr);
        Vertx.clusteredVertx(options, res -> {
            DeploymentOptions deploymentOptions = new DeploymentOptions().setConfig(config);
            if (res.succeeded()) {
                Vertx vertx = res.result();
                //  Injector injector = Guice.createInjector(new AppInjector(vertx));
                Injector injector = Guice.createInjector(new AppInjector(vertx, deploymentOptions));
                vertx.deployVerticle(injector.getInstance(VertxHttpServerVerticle.class), deploymentOptions.setInstances(3));
                ...
}

那是我的 AppInjector 类:

public class AppInjector extends AbstractModule {

    private Vertx vertx = null;
    private Context context = null;
    DeploymentOptions deploymentOptions = null;


    public AppInjector(Vertx vertx, DeploymentOptions deploymentOptions) {
        this.vertx = vertx;
        this.context = vertx.getOrCreateContext();
        this.deploymentOptions = deploymentOptions;
    }


    @Override
    protected void configure() {
        bind(LocationService.class).to(LocationServiceImpl.class).in(Singleton.class);
        bind(LocationServiceDAO.class).to(LocationServiceDaoImpl.class).in(Singleton.class);
        bind(RedisRepo.class).toProvider(() -> {
            return new RedisRepo(deploymentOptions.getConfig());
        });
        bind(Neo4jRepo.class).toProvider(() -> {
            return new Neo4jRepo(deploymentOptions.getConfig());
        });
    }
}

知道为什么我会发生碰撞吗? 我知道我应该按名称使用:

com.mycompany.world_map_service.web.http.VertxHttpServerVerticle
,但是如果我注入依赖项,它们将为每个实例重复,不是吗?

java guice inject vert.x
2个回答
1
投票

我知道我来得有点晚了,但对于那些可能会发现这个问题的人来说,这就是“为什么”。 按照错误消息操作:

无法为已创建的 verticle 指定 > 1 个实例

您正在使用 Guice 创建 Verticle 实例,然后尝试部署 3 个实例,但您已经创建了一个 Verticle 实例:

vertx.deployVerticle(injector.getInstance(VertxHttpServerVerticle.class), deploymentOptions.setInstances(3));

这就是为什么要传递类名。您可以在 io.vertx.core.impl.DeploymentManager 中查看流程,它也解释了上述错误。

我知道我应该使用名称: “com.mycompany.world_map_service.web.http.VertxHttpServerVerticle”但是 如果我注入依赖项,它们将为每个重复 例如,他们不会吗?

我不确定你的意思。 如果您出于某种原因不想复制数据/依赖项,也许您可以涉及另一个对象或单例,或者利用 Vertx 的共享数据


0
投票

如果您有单个 Verticle,并且想要运行超过 1 个实例,您可以使用 lambda 来实现。 (这对初学者友好)


Vertx.vertx().deployVerticle(() -> new HelloVerticle(), new DeploymentOptions().setInstances(2))

© www.soinside.com 2019 - 2024. All rights reserved.