dib*_*ger 3 java maven web vert.x
我是 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());
}
});
}
Run Code Online (Sandbox Code Playgroud)
}
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());
}
});
}
Run Code Online (Sandbox Code Playgroud)
}
我的 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>
Run Code Online (Sandbox Code Playgroud)
我运行它java -jar xxx-fat.jar。
当我在浏览器中输入 localhost:8080/q1/xxx 时,它可以返回所需的内容。但是当我尝试访问 localhost:8080/q2/xxx 时,它显示“找不到资源”。你能告诉我如何部署两个路由不同路径的verticles吗?我知道我可以在同一个verticle中路由不同的pathe,我只想知道如何部署和运行多个verticle。提前致谢!
您遇到的问题是两者Verticles都试图绑定到8080您无法做到的同一个端口 ( )。所以第二个Verticle很可能抛出一个BindException并且没有出现。Verticle然后,第一个没有资源,/q2这就是您获得Resource Not Found.
根据 tsegismont 的评论更新:
Vert.x允许多个 Verticles 在称为服务器共享的功能中的同一端口上启动。当发生这种情况时,Vert.x将使用循环策略Verticle依次向每个发送请求。因此,您应该会看到 50% 的请求适用/q1于/q2. 但是 - 正如 tsegismont 所指出的,您的浏览器使用persistent connections所以它保持与单个Verticle. 您应该会发现使用 curl 或其他浏览器可能会给您带来更好的结果。无论哪种方式,这可能都不是您想要的。
如果您需要 2 ,您应该考虑一下Verticles。通常,您希望将 aVerticle视为应用程序的入口点 - 它是bootstrapping您的应用程序/微服务的一种方式。
如果您真的需要 2,Verticles那么您将不得不选择单独的端口或在单独的盒子上运行。如果你不这样做,那么只需routes在同一个router.
有关更多信息,请参阅http://vertx.io/docs/vertx-web/java/Vert.x Web
| 归档时间: |
|
| 查看次数: |
8207 次 |
| 最近记录: |