当前位置: 首页 > 知识库问答 >
问题:

Vert. x:自定义启动未来处理程序总是重写

法烨烨
2023-03-14

垂直。xv3。5.1. 这是我定制的startVerticle方法:

@Override
public void start(Future<Void> startFuture) throws Exception {
    startFuture.setHandler(event -> {
        if (event.succeeded()) {
            logger.info("Server started on port: {}", 8080);
        } else {
            logger.warn("Failed to start: {}", event.cause());
        }
    });
    vertx.createHttpServer()
            .requestHandler(router()::accept)
            .listen(8080, event -> {
                if (event.succeeded()) {
                    startFuture.complete();
                } else {
                    startFuture.fail(event.cause());
                }
            });
}

我希望我的自定义处理程序将在将来完成时被调用。但事实并非如此!在调试模式下,我看到futureempl::setHandler被调用了两次:一次调用我的自定义处理程序,然后在doDeploy期间调用DeploymentManager的处理程序。因此应用了最新的处理程序。

问题是:是否可以为Verticle start指定自定义回调?如果是,我怎么做?

先谢谢你。

共有2个答案

贝自怡
2023-03-14

首先,将你的顶点写成AbstractVerentle扩展。并且不要重写start(Future)方法。相反,使用start()方法。它将从AbstractVerticle.start(Future)中调用,并且您可以在V中指定该未来ertx.deployVerentle-(verentle-,选项,未来)方法。

例如:

你有一些顶点。只执行初始化任务的方法:

@Override
public void start() throws Exception {
    vertx.eventbus().consume(address, m -> {
       // consumer code skipped
    });
}

和垂直配准:

final DeploymentOptions opts = new DeploymentOptions().setWorker(true);
vertx.deployVerticle(verticle, opts, event -> {
    if (event.succeeded()) {
        log.info("Verticle successfully deployed. DeploymentId: " + event.result());
    } else {
        log.error("Verticle failed to deploy. Cause: " + event.cause().getMessage(), event.cause());
    }
});

就这些:)

公冶同
2023-03-14

您不应该更改startFuture的处理程序,因为它属于调用方。因此,简单地说,不要这样做:)未来是用来表示你已经完成了你的开始代码,而不是定义什么应该做,一旦你完成了。

在您的具体示例中,最好在http服务器启动后编写日志,然后向startFuture指示代码执行完毕。

@Override
public void start(Future<Void> startFuture) throws Exception {
    vertx.createHttpServer()
         .requestHandler(router()::accept)
         .listen(8080, event -> {
            if (event.succeeded()) {
                logger.info("Server started on port: {}", 8080);
                startFuture.complete();
            } else {
                logger.warn("Failed to start: {}", event.cause());
                startFuture.fail(event.cause());
            }
         });
}
 类似资料:
  • 请查看下面位于扩展类内部的代码: null

  • 可以通过实现接口或扩展任何现有的实现来创建自己的自定义处理程序。 在下面的示例中,我们通过扩展类创建了自定义处理程序。 为了理解上述与DBUtils相关的概念,让我们编写一个将运行读取查询的示例。 创建一个示例应用程序。 更新在DBUtils入门程序中创建的文件:MainApp.java。 按照下面的说明编译并运行应用程序。 以下是的内容。 以下是文件的内容。 以下是文件的内容。 完成创建源文件后

  • 我们可以通过实现ResultSetHandler接口或扩展ResultSetHandler的任何现有实现来创建我们自己的自定义处理程序。 在下面给出的示例中,我们通过扩展BeanHandler类创建了一个自定义处理程序EmployeeHandler。 要理解与DBUtils相关的上述概念,让我们编写一个运行读取查询的示例。 要编写我们的示例,让我们创建一个示例应用程序。 步 描述 1 更新在 DB

  • 问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个

  • 我已经注册开始使用Twilio,我正在尝试设置快速入门(https://www.twilio.com/docs/voice/client/javascript/quickstart),它几乎可以工作,但来电没有收到: 客户端代码(在getTokenCapables之后在浏览器上使用): 用于语音通话的Twilio函数代码(始终打印控制台,否则永远不会调用条件: 我已经将我的电话号码包含为已验证的来

  • 我想编写自定义Lombok注释处理程序。我知道http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html.但是当前的lombok jar文件并不包含很多内容。类文件,但文件名为。症状自评量表。取而代之的是龙目山。 我发现,的。SCL. lombok文件是. class文件,Lombok的构建脚本在生成jar文件时重