MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Il driver java 3.0 di MongoDB non può rilevare l'eccezione durante l'autenticazione

Le versioni recenti dell'API java di MongoDB generano eccezioni di connessione all'interno di un thread di monitoraggio del demone separato, motivo per cui non è possibile rilevarlo:il corridore è qui nella traccia dello stack:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Per monitorare le eccezioni del client MongoDB, puoi aggiungere un listener che ti consentirà di agire su eventuali eccezioni che potrebbero verificarsi e di controllare lo stato della connessione ogni volta che ne hai bisogno. Non sarai ancora in grado di catturare queste eccezioni, ma la tua applicazione ne sarà almeno informata. Una cosa da notare è che può volerci del tempo prima che la connessione venga stabilita (o fallita), quindi se sei solo interessato a creare una connessione monouso, ti consiglio di implementare un ciclo di sonno che controlli la connessione OK e stati di errore/eccezione. Ho scritto questa soluzione utilizzando la versione 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();
}