Como se conectar ao cluster Atlas M0 (Free Tier) corretamente via driver Java?

Tentando conectar o cluster Atlas via driver Java usando o MongoDB versão 3.6 .

Então, estou escrevendo como:

MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true"); MongoClient mongoClient = new MongoClient(uri); 

Nesse caso, o erro é:

 java.lang.IllegalArgumentException: The connection string is invalid. Connection strings must start with 'mongodb://' at com.mongodb.ConnectionString.(ConnectionString.java:203) at com.mongodb.MongoClientURI.(MongoClientURI.java:176) at com.mongodb.MongoClientURI.(MongoClientURI.java:158) at project.Bot.check(Bot.java:30) at project.Bot.onUpdateReceived(Bot.java:104) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309) 

Quando o programa inicia com o snippet usando o MongoDB versão 3.6 ou posterior sem o +srv :

 MongoClientURI uri = new MongoClientURI("mongodb://admin1:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true"); MongoClient mongoClient = new MongoClient(uri); 

Estou recebendo um erro: insira a descrição da imagem aqui

 com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=cluster0.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0.mongodb.net}, caused by {java.net.UnknownHostException: cluster0.mongodb.net}}] at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369) at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101) at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:75) at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:71) at com.mongodb.binding.ClusterBinding.getReadConnectionSource(ClusterBinding.java:63) at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:201) at com.mongodb.operation.CountOperation.execute(CountOperation.java:206) at com.mongodb.operation.CountOperation.execute(CountOperation.java:53) at com.mongodb.Mongo.execute(Mongo.java:772) at com.mongodb.Mongo$2.execute(Mongo.java:759) at com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:185) at com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:170) at project.Bot.check(Bot.java:36) at project.Bot.onUpdateReceived(Bot.java:103) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309) 

No arquivo POM eu tenho dependência:

   org.mongodb mongo-java-driver 3.6.0  

Além disso, quando eu estou começando mongo meu database é adicionado a este endereço mongodb://127.0.0.1:27017 , mas eu adicionei o caminho para o cluster não para isso. Talvez eu precise escrever caminho para o cluster de concreto ou?

Ofc, eu tenho usuário-administrador. Além disso, posso conectar via Compass ao meu cluster e a partir do shell. processo mongod é iniciado. Este erro aparece apenas quando estou executando no IDE. O mesmo problema provavelmente aqui .

Alguém sabe como resolver esse erro? Eu aprecio qualquer ajuda.

Parece haver alguns problemas aqui

Primeiro

3.6.0 não é a biblioteca de drivers do Mongo que foi realmente carregada no classpath do seu aplicativo; Eu suspeito que você estava testando anteriormente com uma versão antiga e recentemente atualizou o POM? Você estava usando anteriormente a versão 3.2.0.

Como eu sei disso?

Eu comecei a cavar através do código, e na versão 3.6.0 , a mensagem de erro que você forneceu está longe da linha 203. E também, você pode ver que o código acima tem suporte para o +srv .

Voltando às versões anteriores, eu finalmente encontrei o erro na linha 203, na versão 3.2.0 .

Longa história curta, tentando fazer um Maven limpo e reconstruir.

Reinicie o Eclipse para obter novas dependencies se a atualização de um projeto não ajudar.

Segundo

MongoTimeoutException: Tempo limite esgotado após 30.000 ms enquanto aguarda por um servidor

Este é muito provavelmente um problema de configuração do grupo de controle de access / firewall, em que o firewall está impedindo que os pacotes cheguem ao seu cluster Atlas.

Veja como adicionar endereços à lista de permissions .

Resolvi-o! Então, o que eu fiz:

1) Eu tentei apenas conectar-se ao cluster de camada via driver3.6 or later e escrevi mongodb+srv://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true , sempre recebo um erro: Connection strings must start with 'mongodb://' .

2) Ok, eu deletei o snippet +srv e escrevi da mesma forma mongodb://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true e recebo novamente o erro:

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=cluster0-ox90k.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0-ox90k.mongodb.net}, caused by {java.net.UnknownHostException: cluster0-ox90k.mongodb.net}}].

Então, escrevi via driver3.4 or earlier como mongodb://user:@cluster0-shard-00-00-ox90k.mongodb.net:27017,cluster0-shard-00-01-ox90k.mongodb.net:27017,cluster0-shard-00-02-ox90k.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true e finalmente solucionado.


Atualizado: se você quiser usar os drivers 3.6+ , você precisa escrever em vez de formatar a conexão (e evitar meus problemas acima)

 MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true"); MongoClient mongoClient = new MongoClient(uri); 

esta variante (obrigado Kevin Adistambha ) :

  MongoClient mongoClient = MongoClients.create("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true"); 

Nota: a senha precisa escrever não como mongodb://user:@... , apenas no formato mongodb://user:mypassword@... sem chaves <> .

Informações adicionais: se você tiver o problema como java.lang.NoClassDefFoundError: com/mongodb/client/MongoClients usando o driver mais recente (por exemplo, 3.7.1 ou outra coisa), tente alterar a configuração de edição . Espero que ajude alguém.