11

FTP に関する Java 7 の問題について知っている人はいますか? Sun Net ライブラリと Apache Commons Net ライブラリの両方を使用しましたが、どちらも Java 6 で期待どおりに動作しました。これらは localhost サーバーと LAN 内の別のサーバーに対するものです。

バッファリングされたストリーム、バイトからバイトへの転送、Nagle Algorithm をオフにして、Apache の便利なメソッド storeFile() を使用してみました。後者は最終的に localhost で速度を上げましたが、リモート サーバーでのクロールには再び速度が低下しました。 . また、ステートフル FTP フィルタリングをオフにするようにすべてのマシンを設定しました。

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new BufferedInputStream(prepareInputStream(data));
        os = new BufferedOutputStream(prepareOutputStream(data));
        if (is == null || os == null) {
            log.error("Can't build connection");
            return;
        }

        byte[] buf = new byte[4096];
        int c = 1;

        while (c > 0) {
            c = is.read(buf);
            if (c > 0)
            os.write(buf, 0, c);
            data.incrCurrentPosition();
            fireStateChanged(data);
        }
        data.incrCurrentPosition();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        setEnabled(false);  
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

ご覧のとおり、これはかなり標準的な実装コードです。繰り返しますが、Java 6 では、物事は非常に速く進みます。Java 7 では、Sun ライブラリと Apache Commons ライブラリの両方で 10 倍から 20 倍遅くなります。FileZilla のような FTP クライアントを使用すると、FTP が正常に機能していることを確認できるので、Java 7 と関係があると思います。 Java 7 と Windows 7 のファイアウォールの競合。

与えられた洞察を前もって感謝します。

4

3 に答える 3

13

少なくともJava 7で正常に動作するのに十分な種類の修正を見つけました.FTPClientのsetBufferSize(0);を使用してそれを行いました。残念ながら、Sun の Java 7 の Sun Net 実装には同様の方法はないと思います。私は Apache Commons Net に非常に満足しているので、それは問題ではありません。うまくいけば、オラクルはやがてこの問題を解決するでしょう。

于 2012-12-23T06:47:11.100 に答える
5

Commons Net 3.2 には既知のパフォーマンスの問題があり、ここから取得できる 3.3 スナップショットで修正されています。

https://repository.apache.org/content/groups/snapshots/commons-net/commons-net/3.3-SNAPSHOT/

setBufferSize(0) は有効な回避策のように思えますが、スナップショットを使用して問題がなければ、スナップショットを使用して適切な修正を行うのがおそらく最善です ;)

于 2013-04-01T10:50:18.233 に答える