sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB java drivrutin 3.0 kan inte fånga undantag vid autentisering

Nya versioner av MongoDB java API kastar in anslutningsundantag inom en separat demonmonitortråd, varför du inte kan fånga den - löparen finns här i din stackspårning:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

För att övervaka MongoDB-klienten för undantag kan du lägga till en lyssnare som låter dig agera på eventuella undantag som kan uppstå och kontrollera anslutningsstatusen när du behöver. Du kommer fortfarande inte att kunna fånga dessa undantag, men din ansökan kommer åtminstone att göras medveten om dem. En sak att notera är att det kan ta lite tid för anslutningen att upprättas (eller misslyckas), så om du bara är intresserad av att skapa en engångsanslutning skulle jag rekommendera att implementera en sleep loop som kontrollerar anslutningen OK och misslyckade/undantagstillstånd. Jag skrev den här lösningen med 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();
}



  1. Hur man ändrar shard-nyckeln

  2. Hur man växlar ett element i array i mongoDB

  3. mongoose befolka fält utan ref alternativ

  4. meteor:hur kan jag säkerhetskopiera min mongodatabas