MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O driver java do MongoDB 3.0 não pode capturar a exceção ao autenticar


Versões recentes da API java do MongoDB lançam exceções de conexão em um thread de monitor de daemon separado, e é por isso que você não pode pegá-lo - o executor está aqui em seu rastreamento de pilha:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run

Para monitorar o cliente MongoDB em busca de exceções, você pode adicionar um ouvinte que permitirá que você atue em quaisquer exceções que possam ocorrer e verifique o status da conexão sempre que precisar. Você ainda não poderá capturar essas exceções, mas pelo menos seu aplicativo será informado sobre elas. Uma coisa a notar é que pode levar algum tempo para que a conexão seja estabelecida (ou falhe), portanto, se você estiver interessado apenas em criar uma conexão de uso único, recomendo implementar um loop de sono que verifique a conexão OK e estados com falha/exceção. Eu escrevi esta solução usando a versão 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();
}