在vertx中如果我们想要执行不会阻塞主循环的jdbc操作,我们使用以下代码,
client.getConnection(res -> {
if (res.succeeded()) {
SQLConnection connection = res.result();
connection.query("SELECT * FROM some_table", res2 -> {
if (res2.succeeded()) {
ResultSet rs = res2.result();
// Do something with results
}
});
} else {
// Failed to get connection - deal with it
}
});
这里我们添加将在我们的操作完成时执行的处理程序。
现在我想使用Spring Data API
但是它与上面的方式相同
现在我用它如下
@Override
public void start() throws Exception {
final EventBus eventBus = this.vertx.eventBus();
eventBus.<String>consumer(Addresses.BEGIN_MATCH.asString(), handler-> {
this.vertx.executeBlocking(()-> {
final String body = handler.body();
final JsonObject resJO = this.json.asJson(body);
final int matchId = Integer.parseInt(resJO.getString("matchid"));
this.matchService.beginMatch(matchId);//this service call method of crudrepository
log.info("Match [{}] is started",matchId);
}
},
handler->{});
}
这里我使用了执行阻塞,但它使用了来自工作池的线程,它是否可以包含阻塞代码?
答案 0 :(得分:0)
要回答这个问题:如果符合以下条件,则需要使用executeBlocking
方法:
此外,它与问题无关,而且它真的是个人观点,但无论如何我都给出了它:我认为在vert.x应用程序中使用Spring依赖是一个坏主意。 Spring至少使用Spring Core与基于Servlet的应用程序相关。我的意思是,在完全基于Spring的生态系统中使用它是相关的。否则,您将把许多未使用的大依赖项带回到jar文件中。
对于几乎每个Spring模块,您都有相同目的的小型,轻型和独立的库。例如,对于IoC,您有guice
,hk2
,weld
...
就个人而言,如果我需要使用基于SQL的数据库,我会受到Spring的JdbcTemplate
和RowMapper
模型的启发而不使用任何Spring依赖项。使用如下简单的界面重现它非常简单:
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface RowMapper<T extends Serializable> {
T map(ResultSet rs) throws SQLException;
}
另一个接口DatabaseProcessor
,其方法如下:
<T extends Serializable> List<T> execute(String query, List<QueryParam> params, RowMapper<T> rowMapper) throws SQLException;
一个类QueryParam
,其中包含查询参数的值,顺序和名称(以避免SQL注入漏洞)。