MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB Java Driver 3.0 nie może złapać wyjątku podczas uwierzytelniania

Najnowsze wersje interfejsu MongoDB java API zgłaszają wyjątki połączenia w osobnym wątku monitora demona, dlatego nie można go przechwycić — program uruchamiający znajduje się tutaj w śladzie stosu:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Aby monitorować klienta MongoDB pod kątem wyjątków, możesz dodać odbiornik, który pozwoli Ci działać na wyjątkach, które mogą wystąpić, i sprawdzać stan połączenia w dowolnym momencie. Nadal nie będziesz w stanie wychwycić tych wyjątków, ale Twoja aplikacja zostanie przynajmniej o nich poinformowana. Należy zauważyć, że nawiązanie połączenia może zająć trochę czasu (lub zakończyć się niepowodzeniem), więc jeśli jesteś zainteresowany utworzeniem połączenia jednorazowego użytku, polecam zaimplementować pętlę uśpienia, która sprawdza, czy połączenie jest OK oraz stany niepowodzenia/wyjątków. Napisałem to rozwiązanie używając wersji 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();
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Geolokalizacja Mongo przy użyciu indeksu $blisko i 2d nie jest dokładna

  2. Grupa Mongodb i sortowanie

  3. Ekspozycja MongoDB ObjectIds

  4. Mongo DB z C# - dokument dodawany niezależnie od transakcji

  5. Docker:łączenie kontenera Spring Boot z kontenerem Mongo DB