2016-01-02 14 views
10

Chcę być w stanie wykryć, czy serwer mongo jest dostępny ze sterownika java w celu reagowania na wszelkie nieprawidłowe zdarzenia, tak jak na ziemi JDBC itp. Wszystko działa dobrze, gdy serwer jest gotowy, ale mam problemy zrozumieć, dlaczego tak trudno jest wykryć błędy. Mam to uczucie, ponieważ klient mongo działa w innym wątku i nie rzuca się do mnie czy coś takiego?Sterownik java mongodb Jak złapać wyjątki?

try { 
     MongoClient mongoClient = new MongoClient("localhost", 27017); 
     MongoDatabase db = mongoClient.getDatabase("mydb"); 
     // if db is down or error getting people collection handle it in catch block 
     MongoCollection<Document> people = commentarr.getCollection("people"); 
    } catch (Exception e) { 
     // handle server down or failed query here. 
    } 

Rezultatem jest

INFO: Exception in monitor thread while connecting to server localhost:27017 

Z otrzymanej ślad stosu zawierającego kilka różnych wyjątków, które starałem się złapać, ale moje bloki catch jeszcze nic nie zrobił.

com.mongodb.MongoSocketOpenException: Exception opening socket 
Caused by: java.net.ConnectException: Connection refused 

Używam sterownika java MongoDB 3.0.4, większość posty czytałem są ze starszej API z hacki jak MongoClient.getDatabaseNames() który rzuca MongoException jeśli błędy, oprócz tego jest przestarzała i teraz zastąpiona MongoClient.listDatabaseNames() który robi” t mają tę samą semantykę wyrzucania błędów.

Czy istnieje sposób, aby po prostu wykonać zapytanie mongo ze sterownika java w bloku catch catch i rzeczywiście przechwycić wyjątek?

+1

@Alexander Kondaurov Czy możesz spojrzeć na tę odpowiedź? http://stackoverflow.com/questions/40813060/how-to-catch-exception-when-creating-mongoclient-instance/40814641#40814641. Jeśli szukasz czegoś konkretnego, dodaj do wpisu. – Veeram

Odpowiedz

0

W nowym API MongoException jest RuntimeException. Można też złapać ogólny MongoException lub, wierzę, listDatabaseNames() skończy się wyrzuceniem MongoCommandException ostatecznie.

+0

Dzięki, wypróbowałem wymienione wyjątki, ale niestety wyjątki nie zostały zatrzymane. –

+0

próbowałeś złapać 'MongoSocketOpenException'? To jest ta, którą aktywnie widzisz. Prawdopodobnie dlatego, że mongo nie działa (lub na tym porcie). – evanchooly

+1

Tak, próbowałem tego jednego i około 10 innych, ale żaden z nich nie został złapany w blokach catch. Do tej pory, aby wykryć, kiedy serwer jest wyłączony, jedynym wyjątkiem mogę zauważyć, że działa to 'MongoTimeoutException', który jest wyrzucany przez wiele ms ustawionych przez' MongoClientOptions.builder(). ServerSelectionTime() '. Po prostu idę z tym na razie. –

0

Możesz przekierować System.err do bufora ByteArrayOutputStream. Jeśli zostanie zgłoszony wyjątek środowiska wykonawczego, zostanie on pobrany do bufora. Zobacz odpowiedź na podobny problem pod adresem: https://stackoverflow.com/a/47699292/7388679

Powiązane problemy