我们正在使用JCIFS(1.3.17)从Windows 2003文件服务器加载图像文件.不幸的加载在16384文件后停止工作,我们在尝试访问更多文件时遇到以下异常:
jcifs.smb.SmbException: A device attached to the system is not functioning.
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:563) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbTransport.send(SmbTransport.java:663) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbSession.send(SmbSession.java:238) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbTree.send(SmbTree.java:119) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFile.send(SmbFile.java:775) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFile.open0(SmbFile.java:989) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFile.open(SmbFile.java:1006) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65) ~[jcifs-1.3.17.jar:na]
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844) ~[jcifs-1.3.17.jar:na]
Run Code Online (Sandbox Code Playgroud)
似乎JCIFS中存在某种限制或设置导致此问题.
以下是一些测试代码重现问题:
for (int i = 0; i < 20000; i++) {
try {
SmbFile smbFile = new SmbFile("smb://fileserver/share/image.jpg", auth);
byte[] data = IOUtils.toByteArray(smbFile.getInputStream());
System.out.println(smbFile.getPath() + " " + data.length);
} catch (SmbException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我们检查了文件服务器上的错误日志,但没有什么可看的,所以我们假设我们做错了或者JCIFS中有一些东西我们必须正确配置.
可能找到了解决方案:看起来好像你每个会话只能通过新的SmbFile()打开16384个文件.您必须调用SmbFileInputStream.close(),它调用包私有SmbFile.close(),它似乎向服务器发送SmbComClose消息,该服务器关闭请求并释放资源.
| 归档时间: |
|
| 查看次数: |
2369 次 |
| 最近记录: |