MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le pilote Java MongoDB 3.0 ne peut pas intercepter l'exception lors de l'authentification

Les versions récentes de l'API Java MongoDB lèvent des exceptions de connexion dans un thread de moniteur de démon séparé, c'est pourquoi vous ne pouvez pas l'attraper - le coureur est ici dans votre trace de pile :com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Pour surveiller les exceptions du client MongoDB, vous pouvez ajouter un écouteur qui vous permettra d'agir sur toutes les exceptions susceptibles de se produire et de vérifier l'état de la connexion à tout moment. Vous ne pourrez toujours pas intercepter ces exceptions, mais votre application en sera au moins informée. Une chose à noter est que l'établissement (ou l'échec) de la connexion peut prendre un certain temps, donc si vous êtes simplement intéressé par la création d'une connexion à usage unique, je vous recommande d'implémenter une boucle de veille qui vérifie la connexion OK et les états d'échec/d'exception. J'ai écrit cette solution en utilisant la version 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();
}