Vertx为Spring数据API添加处理程序

时间:2018-04-11 05:49:30

标签: java vert.x

在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->{});
}

这里我使用了执行阻塞,但它使用了来自工作池的线程,它是否可以包含阻塞代码?

1 个答案:

答案 0 :(得分:0)

要回答这个问题:如果符合以下条件,则需要使用executeBlocking方法:

  • 您在单独的pid中运行Verticle的多个实例(使用systemd或docker或任何允许您使用恢复模式安全地运行独立Java进程)并在群集模式下侦听相同的eventbus通道(例如使用hazelcast)。 / LI>
  • 根据tsegismont在此答案的评论中建议,将多个Verticle实例作为工作者Verticle运行。

此外,它与问题无关,而且它真的是个人观点,但无论如何我都给出了它:我认为在vert.x应用程序中使用Spring依赖是一个坏主意。 Spring至少使用Spring Core与基于Servlet的应用程序相关。我的意思是,在完全基于Spring的生态系统中使用它是相关的。否则,您将把许多未使用的大依赖项带回到jar文件中。

对于几乎每个Spring模块,您都有相同目的的小型,轻型和独立的库。例如,对于IoC,您有guicehk2weld ...

就个人而言,如果我需要使用基于SQL的数据库,我会受到Spring的JdbcTemplateRowMapper模型的启发而不使用任何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注入漏洞)。