3

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]

この問題を引き起こす 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();
        }

    }

ファイル サーバーのエラー ログを確認しましたが、何も表示されないため、何か間違ったことを行っているか、JCIFS に適切に構成する必要があるものがあると考えられます。

4

1 に答える 1

8

解決策が見つかった可能性があります。セッションごとに new SmbFile() を介して 16384 個のファイルしか開くことができないようです。リクエストを閉じてリソースを解放するサーバーに SmbComClose メッセージを送信するように見えるパッケージ private SmbFile.close() を呼び出す SmbFileInputStream.close() を呼び出す必要があります

于 2013-07-31T07:32:28.983 に答える