在使用Vertx部署Verticle后,我该如何获取对它的引用?

6

我有一个名为TestService的服务,继承了AbstractVerticle类:

public class TestService extends AbstractVerticle {
  @Override
  public void start() throws Exception {
    //Do things
  }
}

I then deploy that verticle with vertx like this:

Vertx vertx = Vertx.vertx();
vertx.deployVerticle(TestService.class.getName());

如何在vertx实例化TestService之后获取对其的引用?
4个回答

9

您应该使用另一种部署方法:

vertx.deployVerticle(TestService.class.getName(), deployment -> {
  if (deployment.succeeded()) {
    // here is your ID
    String deploymentId = deployment.result();
  } else {
    // deployment failed...
  }
});

如果您只是想列出所有已部署的顶点,则可以请求id列表:
vertx.deploymentIDs()

6
当垂直对象部署后,是否有一种方法来获取对该垂直对象本身的引用?比如:TestService ts = vertx.byId(".."); - ses

4

我知道这个问题很老,但是为了让某些人看到如何实现,它可能是有用的。

通常您会看到像这样的部署示例来自vertx-examples
这是一个异步微服务框架,但是很容易获取参考,因为方法'deployVerticle' (请参见链接中的第29行)将接受如下简单示例中所示的实例,并且可以如下所示在回调中获取引用。

Kotlin示例很容易转换成Java。

MyVert: io.vertx.core.AbstractVerticle() {  
    override fun start() {  
    // init  
     } 
    fun someFunction() {
    }
}  

fun main() {
 val vertx = Vertx.vertx()
 val myVert = MyVert()

 vertx.deployVerticle(myVert) {
    if(it.succeeded()  ) {
        myVert.someFunction()
    }
    else { println(it.cause().localizedMessage)}   }
}

1
您可以通过以下方式获取当前Vertx实例中部署的所有verticle。
Set<String> strings = vertx.deploymentIDs();
strings
    .stream()
    .map(id -> ((VertxImpl)vertx.getDelegate()).getDeployment(id))
    .forEach(deployment -> System.out.println(deployment.verticleIdentifier() + " " + deployment.isChild() ));

0

看起来vertx API不允许您在部署后检索Verticle对象。也许是因为verticles可以分布在多个JVM上。

虽然我需要在单元测试中执行此操作,但我想出了以下解决方案。
这种方法不可靠,因为它依赖于VertxImpl(它可能会在任何vertx版本升级时出现问题)。但是,与更改生产代码以进行测试相比,我更喜欢这种方法。

private static <T extends Verticle> List<T> retrieveVerticles(Vertx vertx, Class<T> verticleClass) {
    VertxImpl vertxImpl = (VertxImpl) vertx;
    return  vertxImpl.deploymentIDs().stream().
            map(vertxImpl::getDeployment).
            map(Deployment::getVerticles).
            flatMap(Set::stream).
            filter(verticleClass::isInstance).
            map(verticleClass::cast).
            collect(Collectors.toList());
}

使用示例:

vertx.deployVerticle(new MainVerticle());
// some MyCustomVerticle instances are deployed from the MainVerticle.start
// you can't reach the MyCustomVerticle objects from there
// so the trick is to rely on VertxImpl
List<MyCustomVerticle> deployedVerticles = retrieveVerticles(vertx, MyCustomVerticle.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接