मोंगोडीबी जावा एपीआई के हाल के संस्करण एक अलग डेमॉन मॉनिटर थ्रेड के भीतर कनेक्शन अपवाद फेंकते हैं, यही कारण है कि आप इसे पकड़ नहीं सकते- धावक यहां आपके स्टैक ट्रेस में है:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.runमजबूत>
अपवादों के लिए MongoDB क्लाइंट की निगरानी करने के लिए, आप एक श्रोता जोड़ सकते हैं जो आपको किसी भी अपवाद पर कार्रवाई करने की अनुमति देगा और कभी भी आपको कनेक्शन की स्थिति की जांच करने की अनुमति देगा। आप अभी भी इन अपवादों को नहीं पकड़ पाएंगे, लेकिन आपके आवेदन को कम से कम उनके बारे में अवगत कराया जाएगा। ध्यान देने वाली एक बात यह है कि कनेक्शन स्थापित होने (या विफल) होने में कुछ समय लग सकता है, इसलिए यदि आप केवल एक बार उपयोग कनेक्शन बनाने में रुचि रखते हैं तो मैं एक स्लीप लूप को लागू करने की अनुशंसा करता हूं जो कनेक्शन की जांच करता है ठीक है और असफल/अपवाद राज्य। मैंने यह समाधान संस्करण 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();
}