J'ai exécuté votre code sur mon propre serveur MongoDB (en cours d'exécution) et je peux voir la même erreur. Ce qui m'a cependant frappé, c'est que l'erreur indique "Attendre 30 000 ms avant l'expiration", mais le code se termine en moins de 30 secondes. Cela donne un indice sur la nature du problème.
Rappelez-vous que c'est asynchrone - vous ne pouvez donc pas vous attendre à ce que toutes les opérations s'exécutent séquentiellement sur le même thread. Ce qui se passe réellement est le main
méthode se termine avant la fin de votre appel à la base de données.
Si vous modifiez votre code pour attendre que les résultats reviennent avant de terminer, vous obtenez un résultat beaucoup plus raisonnable.
Code :
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
// connect to the local database server,default:127.0.0.1:27017
MongoClient mongoClient = MongoClients.create();
// get handle to "testDB" database
MongoDatabase database = (MongoDatabase) mongoClient.getDatabase("testDB");
SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Operation Finished!");
latch.countDown();
}
};
// get a handle to the "test" collection
MongoCollection<Document> collection = database.getCollection("test");
collection.insertOne(new Document("lala", "hehe"), callbackWhenFinished);
latch.await();
}
Résultat :
Aug 11, 2015 9:31:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: No server chosen by PrimaryServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:1, serverValue:4}] to localhost:27017
Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 0, 2]}, minWireVersion=0, maxWireVersion=3, electionId=null, maxDocumentSize=16777216, roundTripTimeNanos=1281647}
Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:2, serverValue:5}] to localhost:27017
Operation Finished!
Soit dit en passant, le code peut encore être simplifié, d'autant plus que vous dites que vous utilisez Java 8 :
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
// connect to the local database server,default:127.0.0.1:27017
MongoClient mongoClient = MongoClients.create();
// get handle to "testDB" database
MongoDatabase database = mongoClient.getDatabase("testDB");
// get a handle to the "test" collection
MongoCollection<Document> collection = database.getCollection("test");
collection.insertOne(new Document("lala", "hehe"),
(result, t) -> {
System.out.println("Operation Finished!");
latch.countDown();
});
latch.await();
}