Mule 4.4使用SMB Connector遇Connection reset by peer问题求助
问题:Mule 4.4 SMB Connector 3.1.1 持续出现Connection reset by peer错误且无法重连
基于Unix容器部署的Mule 4.4本地应用,需创建文件夹并生成文件,使用SMB Connector 3.1.1。初期少量请求正常,5-10分钟后持续抛出Connection reset by peer错误,首次报错后无法重连。
代码示例
<smb:config name="SMB_Connector_Config" doc:name="SMB Connector Config" doc:id="4cb53c1c-edbe-4068-8694-6ed860730b1d" > <smb:connection host="xx.xx.xxx.xx" share="TCS" username="mule" password="****" fileAgeUnit="MINUTES" fileAge="60" socketTimeout="10" socketTimeoutUnit="MINUTES" domain="******.NET"/> </smb:config> <flow name="test-smbFlow" doc:id="657bcb88-1dea-4e67-8390-9567fdfc5c5b" > <http:listener doc:name="Listener" doc:id="8db8d8e0-9cfb-4d5b-afcf-4bcce6d67fc5" config-ref="HTTP_Listener_config" path="test2"/> <ee:transform doc:name="Transform Message" doc:id="a1e88ffe-3d64-4093-97ac-c1bb81040790" > <ee:message > </ee:message> <ee:variables > <ee:set-variable variableName="cachedResponse" ><![CDATA[%dw 2.0 output application/json --- { 'message' : "xyz" }]]></ee:set-variable> <ee:set-variable variableName="fileName" ><![CDATA[output application/java --- "$(correlationId).json"]]></ee:set-variable> <ee:set-variable variableName="folderName" ><![CDATA[%dw 2.0 output application/java --- correlationId]]></ee:set-variable> </ee:variables> </ee:transform> <flow-ref doc:name="test-smbSub_Flow" doc:id="8908444f-6d76-4df6-beff-f03e604e69ea" name="test-smbSub_Flow"/> <logger level="INFO" doc:name="Logger" doc:id="00c0343c-21cc-4af1-8427-2542f0415f0a" /> </flow> <flow name="test-smbSub_Flow" doc:id="bfe3935a-e4ed-44be-b4c5-f148821c395c" > <smb:directory-create doc:name="Directory Create" doc:id="cf111d1a-41f3-4e48-8461-e5f6b1f47849" config-ref="SMB_Connector_Config" dirName="#['\Input\Folder' ++ '\\' ++ vars.folderName]"> <reconnect-forever /> </smb:directory-create> <smb:file-write doc:name="File Write" doc:id="9d654a52-6006-4aae-a21c-de731799ea51" config-ref="SMB_Connector_Config" fileName="#[vars.fileName]" dirName="#['\Input\Folder' ++ '\\' ++ correlationId]"> <reconnect-forever frequency="6000" blocking="false" /> <smb:file-content><![CDATA[#[vars.cachedResponse]]]></smb:file-content> </smb:file-write> </flow>
报错信息
Message : com.hierynomus.protocol.transport.TransportException: java.net.SocketException: Connection reset by peer: socket write error Element : test-smbSub_Flow/processors/0 @ test-smb:test-smb.xml:45 (Directory Create)
已尝试措施
- 更换Connector旧版本
- 切换不同Mule运行时
- 查阅Mule4 SMB Connector官方文档
- 无法从共享服务器团队获得有效支持
- 项目从Mule3迁移而来,原Mule3环境下共享服务可正常使用
解决方案
1. 调整连接池与超时配置
SMB服务器通常会主动断开长时间闲置的连接,需修改客户端配置主动回收闲置连接:
- 降低
socketTimeout至1分钟,配合maxIdleTime设置闲置连接回收时间 - 配置示例:
<smb:config name="SMB_Connector_Config" doc:name="SMB Connector Config"> <smb:connection host="xx.xx.xxx.xx" share="TCS" username="mule" password="****" fileAgeUnit="MINUTES" fileAge="60" socketTimeout="1" socketTimeoutUnit="MINUTES" domain="******.NET" maxConnections="10" maxIdleTime="300000" maxIdleTimeUnit="MILLISECONDS"/> </smb:config>
2. 优化重连策略与连接验证
当前操作节点的重连配置未覆盖连接池层面的死连接问题,需补充全局配置:
- 在连接节点内添加重连与连接验证规则,确保每次使用前检查连接有效性
- 配置示例:
<smb:config name="SMB_Connector_Config" doc:name="SMB Connector Config"> <smb:connection host="xx.xx.xxx.xx" share="TCS" username="mule" password="****" fileAgeUnit="MINUTES" fileAge="60" socketTimeout="1" socketTimeoutUnit="MINUTES" domain="******.NET"> <reconnect frequency="5000" count="3"/> <validation validateConnections="true" /> </smb:connection> </smb:config>
3. 显式关闭连接
在子流操作完成后主动断开连接,避免复用被服务器断开的死连接:
<flow name="test-smbSub_Flow" doc:id="bfe3935a-e4ed-44be-b4c5-f148821c395c" > <smb:directory-create ...> <reconnect-forever /> </smb:directory-create> <smb:file-write ...> <reconnect-forever frequency="6000" blocking="false" /> </smb:file-write> <smb:disconnect config-ref="SMB_Connector_Config" doc:name="Disconnect"/> </flow>
替代方案
1. 直接使用JCIFS-NG Java库
绕过Mule SMB Connector,通过Java组件调用JCIFS-NG实现SMB操作,示例代码:
import jcifs.CIFSContext; import jcifs.config.PropertyConfiguration; import jcifs.context.BaseContext; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileOutputStream; public class SmbOperations { public static void createDirAndWriteFile(String host, String share, String domain, String username, String password, String folderPath, String fileName, String content) throws Exception { // 配置SMB上下文 PropertyConfiguration config = new PropertyConfiguration(); config.setProperty("jcifs.smb.client.domain", domain); config.setProperty("jcifs.smb.client.username", username); config.setProperty("jcifs.smb.client.password", password); CIFSContext context = new BaseContext(config); // 创建目录 String smbFolderUrl = String.format("smb://%s/%s/%s", host, share, folderPath.replace("\\", "/")); SmbFile folder = new SmbFile(smbFolderUrl, context); if (!folder.exists()) { folder.mkdirs(); } // 写入文件 String smbFileUrl = smbFolderUrl + "/" + fileName; try (SmbFileOutputStream out = new SmbFileOutputStream(new SmbFile(smbFileUrl, context))) { out.write(content.getBytes()); } } }
在Mule中通过<java:invoke>调用该方法,需在pom.xml添加依赖:
<dependency> <groupId>org.codelibs</groupId> <artifactId>jcifs-ng</artifactId> <version>2.1.32</version> </dependency>
2. 切换至FTP/SFTP协议
若共享服务器支持FTP或SFTP,替换为Mule的FTP/SFTP Connector,避免SMB协议的兼容性问题,配置更简单且稳定性更高。
关键排查点
- 检查Unix容器的防火墙/网络策略,是否存在自动断开闲置连接的规则
- 确认SMB服务器的会话超时设置,是否短于客户端的
socketTimeout - 启用Connector的DEBUG日志,查看连接建立、闲置、断开的详细过程
内容的提问来源于stack exchange,提问作者Infinity
相关产品推荐
相关产品推荐

