如何抑制微批处理日志中的MongoSocketOpenException异常?
问题:微批处理启动时出现MongoSocketOpenException但程序正常运行,如何阻止该日志?
我有一个每5分钟运行一次的微批处理程序,运行正常,但每次启动时日志都会抛出以下MongoSocketOpenException异常(连接localhost:27017失败),之后程序可继续正常执行:
org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017 com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) at java.net.Socket.connect(Socket.java:606) at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62)
相关配置与环境
- 配置文件中的连接字符串:
mongoDBConnectionString=mongodb://svc.myserviceid:xxxxxxxxxx@server1.mycompany.com:30200,server2.mycompany.com:30200,/?authMechanism=PLAIN&replicaSet=myreplicateset&readPreference=primaryPreferred&authSource=$external&ssl=true mongoDBName=mydatabase
- Spring Boot版本:
1.5.3.RELEASE - Mongo Java驱动版本:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.8.2</version> </dependency>
- 主Spring Boot类:
@SpringBootApplication @EnableTask public class xxApplication { ... }
已尝试的无效方案
- 排除
MongoAutoConfiguration.class和MongoDataAutoConfiguration.class(无论是否搭配@EnableAutoConfiguration) - 在配置文件中添加单独的Spring属性
解决方案
1. 修复连接字符串的语法错误
你的连接字符串末尾存在多余的逗号:server2.mycompany.com:30200,/?authMechanism=...,这个错误会导致Mongo驱动尝试解析空的主机地址,进而默认连接localhost:27017。修正后的连接字符串需去掉该逗号:
mongoDBConnectionString=mongodb://svc.myserviceid:xxxxxxxxxx@server1.mycompany.com:30200,server2.mycompany.com:30200/?authMechanism=PLAIN&replicaSet=myreplicateset&readPreference=primaryPreferred&authSource=$external&ssl=true mongoDBName=mydatabase
这是最可能解决问题的根本方案,修复后驱动会直接连接配置的集群地址,不再尝试localhost。
2. 确保彻底排除Mongo自动配置
在主类上明确指定排除Mongo自动配置类,Spring Boot 1.5.x需在@SpringBootApplication的exclude属性中声明:
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) @EnableTask public class xxApplication { ... }
若仍无效,检查项目中是否有其他依赖(如监控、第三方组件)隐式触发了Mongo客户端初始化,需针对性排除或禁用相关逻辑。
3. 调整Mongo驱动日志级别
如果程序运行正常仅需消除日志干扰,可通过日志配置降低org.mongodb.driver.cluster的日志级别:
- 对于Logback(
logback.xml):
<logger name="org.mongodb.driver.cluster" level="WARN"/>
- 对于Log4j(
log4j.properties):
log4j.logger.org.mongodb.driver.cluster=WARN
配置后仅会打印WARN及以上级别的日志,不再输出INFO级别的连接异常信息。
4. 手动初始化Mongo客户端
完全绕过Spring自动配置,手动创建Mongo客户端实例:
@Configuration public class MongoConfig { @Value("${mongoDBConnectionString}") private String connectionString; @Value("${mongoDBName}") private String dbName; @Bean public MongoClient mongoClient() { MongoClientURI uri = new MongoClientURI(connectionString); return new MongoClient(uri); } @Bean public MongoDatabase mongoDatabase(MongoClient mongoClient) { return mongoClient.getDatabase(dbName); } }
同时确保主类排除Mongo自动配置,避免实例冲突。
内容的提问来源于stack exchange,提问作者MoeMan
相关产品推荐
相关产品推荐

