Бесконечные исключения программы обновления набора реплик MongoDB с использованием драйвера Java весной

#java #spring #mongodb #glassfish

#java #spring #mongodb #glassfish

Вопрос:

Я только что развернул веб-приложение Spring на Glassfish. Это приложение содержит внедренный компонент Spring bean для объекта Mongo, который довольно прост, он просто выглядит следующим образом:

 <bean id="mongo" class="com.mongodb.Mongo">
    <constructor-arg value="127.0.0.1" />
    <constructor-arg value="27017" />
</bean>
  

Я запускаю свое веб-приложение, затем использую этот объект Mongo для запроса базы данных и вставки записей и еще много чего .. и все работает нормально.

Но в моем файле server.log я получаю бесконечный поток SEVERE сообщений об ошибках. Это NullPointerException s и IOException s. Похоже, они как-то связаны с ReplicaSetStatus, но я не знаю, почему он продолжает пытаться подключиться, включен ли он по умолчанию?

Кто-нибудь знает, что вызывает это? Как я могу устранить проблему или остановить то, что их вызывает?

// РЕДАКТИРОВАТЬ: Исключения начинаются сразу после развертывания моего приложения. Но они не прекращаются, когда я отключаю свое приложение или даже отменяю его развертывание.

Эти сообщения просто записываются постоянно, но из того, что я вижу, есть только 4 типа ошибок:

 [#|2011-04-22T17:49:40.818 0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=37;_ThreadName=Thread-1;|can't update node: 27017:27017
java.lang.NullPointerException
    at com.mongodb.OutMessage.reset(OutMessage.java:73)
    at com.mongodb.OutMessage.<init>(OutMessage.java:51)
    at com.mongodb.OutMessage.query(OutMessage.java:38)
    at com.mongodb.DBPort.findOne(DBPort.java:127)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb..updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:263)
|#]

[#|2011-04-22T17:49:40.818 0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=37;_ThreadName=Thread-1;|can't update node: localhost:27017
java.lang.NullPointerException
    at com.mongodb.OutMessage.reset(OutMessage.java:73)
    at com.mongodb.OutMessage.<init>(OutMessage.java:51)
    at com.mongodb.OutMessage.query(OutMessage.java:38)
    at com.mongodb.DBPort.findOne(DBPort.java:127)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]

[#|2011-04-22T17:49:41.676 0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=48;_ThreadName=Thread-1;|can't update node: 127.0.0.1:27017
java.io.IOException: couldn't connect to [/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused: connect
    at com.mongodb.DBPort._open(DBPort.java:206)
    at com.mongodb.DBPort.go(DBPort.java:94)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.findOne(DBPort.java:129)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]

[#|2011-04-22T17:49:41.676 0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=48;_ThreadName=Thread-1;|can't update node: 27017:27017
java.io.IOException: couldn't connect to [/0.0.105.137:27017] bc:java.net.SocketException: Network is unreachable: connect
    at com.mongodb.DBPort._open(DBPort.java:206)
    at com.mongodb.DBPort.go(DBPort.java:94)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.findOne(DBPort.java:129)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]
  

Комментарии:

1. Вы используете кластер Mongo или только 1 узел на вашем локальном хостинге? Можете ли вы вставить команду mongod, которую вы используете для запуска узла?

2. Я думаю, что у меня есть только один узел. Я запускаю тестовую копию локально на Windows7. Я запускаю mongdb, просто дважды щелкнув mongod.exe

3. К сожалению, я ничего не знаю о Windows: ( Можете ли вы подключиться к серверу mongo через клиент командной строки? Это должно быть mongo.exe .

4. Мне трудно в это поверить, но похоже, что каким-то образом вы запускаете mongod с опцией —replSet для настройки этого узла как части набора реплик.

5. Да, он отлично подключается и отлично работает из командной строки, а также изнутри Java. Я просто обеспокоен, потому что постоянные попытки подключения, вероятно, не очень хороши для моего сервера приложений.

Ответ №1:

Измените определение компонента Mongo bean в файле контекста Spring, как здесь:

     <constructor-arg value="${db.host}" type="java.lang.String" />
    <constructor-arg value="${db.port}" type="int" />
  

Если вы опускаете атрибуты типа, вызывается другой конструктор класса Mongo, где аргументами являются экземпляры типа com.mongodb.ServerAddress, а 27017 обрабатывается как имя хоста, и InetAddress.getAllByName( host ) преобразуется в этот IP 0.0.105.137.

Комментарии:

1. На самом деле оказывается, что это сработало =) Я просто сломал свою сборку, поэтому новый файл WAR не был развернут. Arigatou!