Vert.x Native, MySqlClient
In zero system, we consider more freedom to developers, in this kind of situation, it provide the specific injection for native clients such as following:
Zero system fully supported vert.x clients here. this chapter we’ll focus on MySqlClient to
connect existing database.
Demo projects:
- Standalone - 6073:
up-gaea
1. Configuration
This chapter is duplicated with D10072 - Configuration, vertx-mysql.yml, because that’s the preparing steps for mysql client.
1.1. vertx.yml
zero:
lime: mysql
vertx:
instance:
- name: vertx-zeus
options:
maxEventLoopExecuteTime: 30000000000
1.2. vertx-inject.yml
mysql: io.vertx.up.plugin.jdbc.MySqlInfix
1.3. vertx-mysql.yml
All the mysql configurations are put into vertx-mysql.yml the root node mysql as following:
mysql:
host: localhost
port: 3306
username: htl
password: "******"
database: DB_ZERO
provider_class: "io.vertx.ext.jdbc.spi.impl.HikariCPDataSourceProvider"
All above configuration is for mysql native configuration supported, but for up-gaea project, there need some
additional configuration ( Server Config ).
2. Server Configuration
vertx-server.yml
server:
- name: up-gaea
type: http
config:
port: 6073
host: 0.0.0.0
Finally when you have finished configuration, the folder structure of project should be as following:

3. Source Code
3.1. Api
package up.god.micro.tabular;
import io.zerows.epoch.annotations.Address;
import io.zerows.epoch.annotations.EndPoint;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@EndPoint
@Path("/api")
public interface DbApi {
@Path("native/{type}")
@GET
@Address("ZERO://QUEUE/NATIVE/GET")
String sayDb(@PathParam("type") String type);
}
3.2. Consumer
package up.god.micro.tabular;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonArray;
import io.vertx.ext.sql.ResultSet;
import io.vertx.ext.sql.SQLClient;
import io.vertx.up.aiki.Ux;
import io.zerows.epoch.annotations.Address;
import io.zerows.epoch.annotations.Queue;
import io.vertx.up.atom.Envelop;
import io.zerows.annotations.infix.MySql;
@Queue
public class DbWorker {
@MySql
private transient SQLClient client;
@Address("ZERO://QUEUE/NATIVE/GET")
public void sayDb(final Message<Envelop> message) {
final String type = Ux.getString(message);
this.client.queryWithParams("SELECT * FROM SYS_TABULAR WHERE S_TYPE=?",
new JsonArray().add(type), handler -> {
// Success or Failure
if (handler.succeeded()) {
final ResultSet res = handler.result();
// Build result json array
for (final JsonArray item : res.getResults()) {
System.out.println(item);
}
message.reply(Envelop.success(res.getResults()));
} else {
// Replied with error, now only print stack
handler.cause().printStackTrace();
message.reply(Envelop.ok());
}
});
}
}
4. Console
When you start this application you should see following logs:
infix-afflux-operation | io.vertx.ext.asyncsql.impl.MYSQLClientImpl -| \
Creating configuration for localhost:3306
It means that the connection has been built, then when you send following request, you should get the data as following:
URL : http://localhost:6073/api/native/room.status
Method : GET
Response :
{
"data": [
[
8,
null,
"可操作",
"Operation",
null,
"room.status",
"{\"visible\":false}",
1,
1,
"ENhwBAJPZuSgIAE5EDakR6yrIQbOoOPq",
"cn",
null,
"2018-02-07T04:09:32.000",
null,
null
],
......
]
]
5. Summary
Here are some points need to be mention.
- There is an annotation
io.zerows.annotations.infix.MySqlcould be used to inject SQLClient, it’s the same as@Injectof JSR303, but you must be sure your configuration of MySql has been setup correctly. - Another thing is that here we used
io.vertx.ext.sql.SQLClientto hold the created reference, it’s not the reference ofio.vertx.ext.asyncsql.MySQLClientbecause the native vert.x document mentioned: http://vertx.io/docs/vertx-mysql-postgresql-client/java/#_specifying_a_pool_name - The last point is that it’s best to use
Envelop.successto build response and let message replied, do not reply the data directly, you can pass any type of data intoEnvelop.successmethod.