我是 Vert.x 的新手,我想通过 jar 运行多个 Verticle。我有两个文件,一个是 MyFirstVertice.java,它路由路径“/q1/”并返回一些东西。第二个是 MySecondVertice.java,它路由路径“/q2/”。第二个顶点部署在第一个顶点中。

MyFirstVertice.java

public class MyFirstVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);
    router.route("/q1/*").handler(routingContext -> {
        HttpServerRequest request = routingContext.request();
        String Y = request.getParam("key");
        String cipherText = request.getParam("message");

        HttpServerResponse response = routingContext.response();

        response.setChunked(true);
        response.putHeader("content-type", "text/plain");
        response.write(Y + "\n");
        response.write(cipherText + "\n");
        response.end();

        vertx.deployVerticle(new MySecondVerticle(), stringAsyncResult -> {
            System.out.println("Second verticle is deployed successfully.");
        });
    });

    server.requestHandler(router::accept).listen(8080, httpServerAsyncResult -> {
        if (httpServerAsyncResult.succeeded()) {
            fut.complete();
        } else {
            fut.fail(httpServerAsyncResult.cause());
        }
    });
}

}

MySecondVetice.java
public class MySecondVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);
    router.route("/q2/*").handler(routingContext -> {
        HttpServerResponse response = routingContext.response();
        response.setChunked(true);
        response.putHeader("content-type", "text/plain");

        response.end("q2");
    });

    server.requestHandler(router::accept).listen(8080, httpServerAsyncResult -> {
        if (httpServerAsyncResult.succeeded()) {
            fut.complete();
        } else {
            fut.fail(httpServerAsyncResult.cause());
        }
    });
}

}

我的 pom.xml
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>io.vertx.core.Starter</Main-Class>
                                    <Main-Verticle>tutorial.diluo.MyFirstVerticle</Main-Verticle>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                        <artifactSet/>
                        <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>

我通过 java -jar xxx-fat.jar 运行它。

当我在浏览器中输入 localhost:8080/q1/xxx 时,它可以返回所需的内容。但是当我尝试访问 localhost:8080/q2/xxx 时,它显示“找不到资源”。你能告诉我如何部署两个路由不同路径的verticles吗?我知道我可以在同一个verticle中路由不同的pathe,我只想知道如何部署和运行多个verticle。提前致谢!

最佳答案

您遇到的问题是 Verticles 都试图绑定(bind)到您无法执行的同一端口 ( 8080 )。
所以第二个 Verticle 很可能抛出一个 BindException 并且没有出现。然后,第一个 Verticle/q2 处没有资源,这就是您获得 Resource Not Found 的原因。

根据 tsegismont 的评论更新:
Vert.x 允许多个 Verticles 在称为 server sharing 的功能中的同一端口上启动。发生这种情况时,Vert.x 将使用循环策略依次向每个 Verticle 发送请求。因此,您应该看到 50% 的请求适用于 /q1 ,而 50% 的请求适用于 /q2 。但是 - 正如 tsegismont 所指出的,您的浏览器使用 persistent connections 因此它保持与单个 Verticle 的连接。您应该会发现使用 curl 或其他浏览器可能会给您带来更好的结果。无论哪种方式,这可能都不是您想要的。

如果您需要 2 个 Verticles ,您应该考虑一下。通常,您希望将 Verticle 视为应用程序的入口点 - 这是 bootstrapping 您的应用程序/微服务的一种方式。

如果您确实需要 2 个 Verticles,那么您将不得不选择单独的端口或在单独的盒子上运行。如果不这样做,那么只需在同一个 routes 上创建 2 个 router

有关 Vert.x Web 的更多信息,请参阅 http://vertx.io/docs/vertx-web/java/

关于java - 如何在 Vert.x 中运行多个顶点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42666482/

10-12 02:03