You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抑制微批处理日志中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:05:33