MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Der MongoDB-Java-Treiber 3.0 kann bei der Authentifizierung keine Ausnahme abfangen

Neuere Versionen der MongoDB-Java-API werfen Verbindungsausnahmen in einen separaten Daemon-Monitor-Thread, weshalb Sie sie nicht abfangen können – der Runner befindet sich hier in Ihrem Stack-Trace:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Um den MongoDB-Client auf Ausnahmen zu überwachen, können Sie einen Listener hinzufügen, der es Ihnen ermöglicht, auf eventuell auftretende Ausnahmen zu reagieren und den Verbindungsstatus jederzeit zu überprüfen. Sie können diese Ausnahmen immer noch nicht abfangen, aber Ihre Anwendung wird zumindest darauf aufmerksam gemacht. Zu beachten ist, dass es einige Zeit dauern kann, bis die Verbindung hergestellt ist (oder fehlschlägt). Wenn Sie also nur daran interessiert sind, eine Verbindung zur einmaligen Verwendung zu erstellen, würde ich empfehlen, eine Schlafschleife zu implementieren, die prüft, ob die Verbindung in Ordnung ist und fehlgeschlagene/Ausnahmezustände. Ich habe diese Lösung mit Version 3.3 geschrieben (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();
}