Как правильно обрабатывать исключения в MongoClient для VertX - PullRequest
0 голосов
/ 15 марта 2019

В методе запуска моего приложения я хочу убедиться, что учетные данные для MongoDB, предоставленные приложению, в порядке. Если они в порядке, я продолжаю запуск, если нет, приложение должно завершиться, поскольку оно не может подключиться к БД. Фрагмент кода, как показано ниже:

  // Create the client
  MongoClient mongodb = null;
  try {
      mongodb = MongoClient.createShared(vertx, mongo_cnf, mongo_cnf.getString("pool_name"));
  }
  catch(Exception e) {
      log.error("Unable to create MongoDB client. Cause: '{}'. Bailing out", e.getMessage());
      System.exit(-1);
  }

Если я предоставляю неверные учетные данные, блок catch не вызывается. Тем не менее, я получаю на консоли следующее:

  19:35:43.017 WARN  org.mongodb.driver.connection - Exception thrown during connection pool background maintenance task
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='user', source='admin', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:162)
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:39)
... many lines

Вопрос : как перехватить это исключение в моем коде и уметь его правильно обрабатывать?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

В настоящее время исключение не выдается, что, на мой взгляд, ошибка в дизайне, поскольку вы получаете объект, с которым вы не можете работать. Не стесняйтесь открывать ошибку: https://github.com/vert-x3/vertx-mongo-client/issues

Чтобы определить, что ваш клиент "мертв или прибыл", вы можете подождать 20 повторных попыток:

MongoClient client = MongoClient.createShared(vertx, config, "pool_name");
client.findOne("some_collection", json1, json2, (h) -> {
    if (h.succeeded()) {
        //...
    }
    else {
        // Notify that the client is dead
    }
});
1 голос
/ 16 марта 2019

Исключение происходит в потоке демона java-драйвера mongodb, поэтому вы не можете его перехватить.

Vertx MongoClient абстрагирует вас от прямого взаимодействия с драйвером MongoDB Java, поэтому вы не можете изменять что-либо, связанное с клиентом.

Вы можете получить доступ к экземпляру клиента mongo через отражение, но, поскольку он уже создан, вы не можете передать ему дополнительную конфигурацию.

Если вы использовали com.mongodb.async.client.MongoClient, вы могли бы передать ServerListener, который мог бы получить доступ к исключению, и вы могли бы его изучить (см. Этот ответ для более подробной информации - https://stackoverflow.com/a/46526000/1126831).

Но можно указать ServerListener только в момент создания клиента mongo, который происходит внутри оболочки Vertx MongoClient, и эту дополнительную конфигурацию пропустить невозможно.

...