#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!