sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB java driver 3.0 no puede detectar una excepción cuando se autentica

Las versiones recientes de la API java de MongoDB arrojan excepciones de conexión dentro de un subproceso de monitor de daemon separado, por lo que no puede detectarlo; el corredor está aquí en su seguimiento de pila:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Para monitorear el cliente MongoDB en busca de excepciones, puede agregar un oyente que le permitirá actuar sobre cualquier excepción que pueda ocurrir y verificar el estado de la conexión en cualquier momento que lo necesite. Aún no podrá detectar estas excepciones, pero su aplicación al menos las reconocerá. Una cosa a tener en cuenta es que la conexión puede demorar un tiempo en establecerse (o fallar), por lo que si solo está interesado en crear una conexión de un solo uso, le recomiendo implementar un ciclo de suspensión que verifique que la conexión sea correcta. y estados fallidos/de excepción. Escribí esta solución usando la versión 3.3 (https://api.mongodb.com/java/3.3/ ):

public class MongoStatusListener implements ServerListener {

    private boolean available = false;

    public boolean isAvailable() {
        return available;
    }

    @Override
    public void serverOpening(ServerOpeningEvent event) {}

    @Override
    public void serverClosed(ServerClosedEvent event) {}

    @Override
    public void serverDescriptionChanged(ServerDescriptionChangedEvent event) {

        if (event.getNewDescription().isOk()) {
            available = true;
        } else if (event.getNewDescription().getException() != null) {
            //System.out.println("exception: " + event.getNewDescription().getException().getMessage());
            available = false;
        }
    }
}

public MongoClient getMongoClient(String login, String password) {

    if (mongoClient != null) {
        return mongoClient;
    }
    MongoClientOptions.Builder optionsBuilder = new MongoClientOptions.Builder();
    MongoStatusListener mongoStatusListener = new MongoStatusListener();
    optionsBuilder.addServerListener(mongoStatusListener);

    this.mongoClient = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27017")),
        singletonList(MongoCredential.createCredential(
        login,
        "cookbook",
        password.toCharArray())
    ), optionsBuilder.build());

    this.mongoDatabase = mongoClient.getDatabase("cookbook");
    return mongoClient;
}

public boolean isAvailable() {
    return mongoStatusListener.isAvailable();
}