Uruchomiłem twój kod na moim własnym (działającym) serwerze MongoDB i widzę ten sam błąd. Uderzyło mnie jednak to, że błąd mówi „Oczekiwanie 30000 ms przed przekroczeniem limitu czasu”, ale kod kończy się w znacznie mniej niż 30 sekund. Daje to wskazówkę, na czym polega problem.
Pamiętaj, że jest to asynchroniczne — dlatego nie można oczekiwać, że wszystkie operacje będą wykonywane sekwencyjnie w tym samym wątku. To, co się właściwie dzieje, to main
metoda kończy się przed zakończeniem wywołania bazy danych.
Jeśli zmienisz kod, aby poczekać na powrót wyników przed zakończeniem, uzyskasz znacznie bardziej rozsądny wynik.
Kod:
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();
}
Wynik:
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!
Nawiasem mówiąc, kod można jeszcze bardziej uprościć, zwłaszcza że mówisz, że używasz Javy 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();
}