vertx命令行选项解析

背景

我们在开发,测试,生产环境需要设置Vert.x不同的VertxOptions,通常可以通过自定义Launcher,复写beforeStartingVertx方法来设置VertxOptions。 eg.

1
2
3
4
5
6
@Override
public void beforeStartingVertx(VertxOptions options) {
options.setEventLoopPoolSize(Runtime.getRuntime().availableProcessors() * 2);
options.setWorkerPoolSize(Integer.getInteger(VERTX_WORKER_POOL_SIZE, DEFAULT_WORKER_POOL_SIZE));
System.setProperty("IGNITE_NO_SHUTDOWN_HOOK", "true");
}

vert.x web开发之BodyHandler

前言

Web 开发肯定需要处理POST请求和文件上传请求。默认Vert.x并不会处理http请求体,除非你显示设置了BodyHandlerBodyHandler的作用是读取整个请求体,并将解析后请求体数据设置到RoutingContext

BodyHandler的默认实现是BodyHandlerImpl

BodyHandler 核心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public void handle(RoutingContext context) {
HttpServerRequest request = context.request();
// we need to keep state since we can be called again on reroute
Boolean handled = context.get(BODY_HANDLED);
if (handled == null || !handled) {
BHandler handler = new BHandler(context);
request.handler(handler);
request.endHandler(v -> handler.end());
context.put(BODY_HANDLED, true);
} else {
// on reroute we need to re-merge the form params if that was desired
if (mergeFormAttributes && request.isExpectMultipart()) {
request.params().addAll(request.formAttributes());
}
context.next();
}
}

BodyHandler 处理 POST请求。

vertx中web全局异常处理

前言

在以前使用springMVC时,全局异常的处理的方式有很多。现在使用vertx-web开发web应用,同样有这样的需要,而且实现全局异常的处理更简单。

404 已经 500 异常处理

我们先看一段简单的代码:

vertx中vertx-jdbc-client使用问题总结

背景

在使用vertx-jdbc-client中发现了一些问题,此文就是将我遇到的问题进行总结记录。希望能帮助同样遇到问题想找答案的人。

SQLOperations.querySingleWithParams 空指针

在使用该方法想要返回一条记录时,如果数据库没有对应的数据,那么会报空指针。具体原因如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
return queryWithParams(sql, arguments, execute -> {
if (execute.failed()) {
handler.handle(Future.failedFuture(execute.cause()));
} else {
final ResultSet rs = execute.result();
if (rs == null) {
handler.handle(Future.succeededFuture());
} else {
//这里的判断不严谨,应用是==null || results.size() == 0
List<JsonArray> results = rs.getResults();
if (results == null) {
handler.handle(Future.succeededFuture());
} else {
handler.handle(Future.succeededFuture(results.get(0)));
}
}
}
});

vert.x run 命令解析

背景

在学习vert.x 蓝图系列工程是,发现项目的配置文件是通过启动参数-conf来指定的。在项目中没有发现解析该参数的代码,很是疑惑!那究竟是谁来处理该参数的呢?经过20分钟的努力终于找到了答案:RunCommand。耗时的原因是对Vert.x还不是很熟悉,知识点都没有串起来。

RunCommand提供了很多参数来启动Vert.x应用。下面我就一一分析下。

java8中CompletableFuture解析

背景

在JDK8以前我们都知道Future是用来代表一个异步计算的结果的。在最新的JDK8中引入了一个新的类CompletableFuture。它和以前的Future有哪些不同?它解决Future的哪些不足?这些个问题就是我需要搞清楚的问题。

CompletionStage

在学习CompletableFuture前需要先搞清楚CompletionStage的作用。从字面意思来看,该类表示任务的完成阶段。JDK的说明文档如下:

一个可能执行的异步计算的某个阶段,在另一个CompletionStage完成时执行一个操作或计算一个值。一个阶段完成后,其计算结束。但是,该计算阶段可能会触发下一个计算阶段。

该接口的主要方法如下:

vertx创建http服务器分析

创建HTTP服务器

从前面的文章我们知道Vert.x创建一个HttpServer的API是非常简单的,但需要注意的是里面的机制是非常复杂的,现在我们就来仔细分析一下Vert.x是如何一步步创建一个HttpServer的。

创建http服务器代码

1
2
3
4
5
6
7
8
9
public class MyVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.createHttpServer().requestHandler(req -> {
res.response().end("hello Vert.x");
}).listen(8888);
}
}
vertx.deployVerticle(MyVerticle.class.getName());

Vertx发布Verticle的分析参考:vert.x之Vertx类解析

http协议之content-type

背景

最近在学习vert.x,准备使用vert.x重构之前的网关应用。在开发的过程中发现post请求,没有添加请求头Content-Type时,后端的tomcat应用不能获取参数。查了一些文档后对这个问题有了结论:

vert.x之Vertx类解析

Vertx

Vertx 是整个Vert.x核心API的入口,利用该对象可以创建,组合一个完整的Vert.x应用。

一个Vertx实例有如下的核心方法:

static Vertx vertx()

该方法通过VertxFactory工厂类来创建一个Vertx实例。

static Vertx vertx(VertxOptions options)

用参数VertxOptions指定的配置项创建一个Vertx的实例。

static void clusteredVertx(VertxOptions options, Handler> resultHandler)

用参数VertxOptions指定的配置项创建一个支持集群的Vertx的实例。

|