Vertx JDBCClient с таймером HttpVerticle - PullRequest
0 голосов
/ 24 октября 2018

Мне нужна помощь в устранении неисправностей одного из моих сервисов vertx.У меня есть вертикал базы данных, который использует JDBCClient.До недавнего времени мой код работал нормально, и теперь он начал давать исключение тайм-аута.Клиент db тратит слишком много времени, чтобы вернуть результаты, и к тому времени, когда он возвращает результаты, httpverticle истекает.

Когда я запрашиваю базу данных вне vertx, она возвращает результат в течение 10 миллисекунд, поэтому я считаю, что база данных работает нормально.Сбой не сразу после перезагрузки.Так что, похоже, не из-за перегрузки.

Мой код:

public class TestDbVerticle extends AbstractVerticle {
    private static final Logger logger = LoggerFactory.getLogger("TestDbVerticle");

    private JDBCClient dbClient;

    @Override
    public void start(Future < Void > startFuture) throws Exception {
        logger.trace("start - Starting TestDbVerticle...");

        JsonObject config = new JsonObject();
        config.put("url", config().getString("url"));
        config.put("driver_class", config().getString("driver_class"));
        config.put("max_pool_size", config().getInteger("max_pool_size"));
        config.put("min_pool_size", config().getInteger("min_pool_size"));
        config.put("max_statements", config().getInteger("max_statements"));

        dbClient = JDBCClient.createShared(vertx, config, "jdbc/test");

        dbClient.getConnection(ar - > {
            if (ar.failed()) {
                logger.error("start- Could not open a database connection", ar.cause());
                startFuture.fail(ar.cause());
            } else {
                logger.trace("start- DB Vertcle connected to db successfully.");

                vertx.eventBus().consumer(config().getString("test.queue.address"), this::onMessage);
                startFuture.complete();
            }
        });
    }

    public void onMessage(Message < JsonObject > message) {
        if (!message.headers().contains("action")) {
            logger.error("No action header specified for message with headers {} and body {}", message.headers(),
                message.body().encodePrettily());
            message.fail(100, "No action header specified");
            return;
        }
        String action = message.headers().get("action");

        switch (action) {
            case "find_by_id":
                findById(message);
                break;

            default:
                message.fail(101, "Bad action: " + action);
        }
    }

    private void findById(Message < JsonObject > message) {
        try {
            JsonObject request = message.body();

            Long id = Long.parseLong(request.getString("id").trim());

            JsonArray params = new JsonArray().add(id);

            final long time = System.currentTimeMillis();

            String query = "SELECT * from test WHERE test_id =? ORDER BY created_date DESC;";
            logger.debug("findById - params [" + params + "}. query [" + query + "]");

            dbClient.queryWithParams(query, params, result - > {
                long currentTime = System.currentTimeMillis();
                long totalTime = currentTime - time;
                logger.debug("findById - Total time taken to execute query [" + totalTime + "]");

                if (result.succeeded()) {
                    logger.debug("findById - Query exection successed with numrows [" + result.result().getNumRows() + "]");
                    if (result.result().getNumRows() > 0) {
                        message.reply(result.result().getRows().get(0).toString());
                    } else {
                        message.reply(result.result().getRows().toString());
                    }

                } else {
                    logger.error("findById - Failed getting data", result.cause());

                    JsonObject out = new JsonObject();
                    out.put("error_code", 10);
                    out.put("status", "Fail");

                    message.reply(out);
                }
            });
        } catch (Exception e) {
            logger.error("findById - Failed getting data by id failed", e);

            JsonObject out = new JsonObject();
            out.put("error_code", 20);
            out.put("status", "GenericException");

            message.reply(out);
        }
    }
}

Метод запуска выполняется без проблем.Журнал выводит «start-DB Vertcle успешно подключен к БД».Вызовы из http verticle доходит до метода onMessage и findById.Запрос на печать строки № 74, а затем ошибки http ver vert, ожидающие 30000 миллисекунд.Время, необходимое для выполнения метода dbClient.queryWithParams, составило более минуты.До недавнего времени это работало нормально.

Я изменил пул соединений на HikariCP, и он не сделал различий.

Может кто-нибудь помочь решить проблему?

...